我正在尝试用javafx制作子手游戏。因此,很自然,我没有使用26个单独的按钮,而是尝试使用for循环创建每个按钮。我将它们放入一个名为Alphabet的ArrayList中,并将其添加到flowPane中。我遇到的麻烦是,当我尝试将每个按钮的操作设置为带有字母参数的函数时,该功能会检查字母是否已使用或是否在单词中。
所有实例:
ArrayList<Button> alphabet = new ArrayList<Button>();
FlowPane keyboard = new FlowPane();
letterGuess函数(当前为空)
public void letterGuess(char letter) {
}
launch()函数中的代码:
char letter;
for(int i=0 ; i<26 ; i++) {
letter = (char) (i+65);
alphabet.add(new Button("" + letter));
keyboard.getChildren().add(alphabet.get(i));
alphabet.get(i).setOnAction(e -> letterGuess(letter));
}
我希望代码能够正确运行,并成功将每个按钮的字母传递给letterGuess()。我得到的错误是字母 Alphabet.get(i).setOnAction(e-> letterGuess(字母));该错误表明:在封闭范围内定义的局部变量字母必须是最终的或实际上是最终的
答案 0 :(得分:1)
问题是您在循环外声明了letter
,因此试图在循环内更改其值。这意味着lambda不能使用它,因为它不是最终版本或“有效”最终版本。
您可以通过在循环中将char
声明为新来解决此问题。
这是您编写循环的另一种方法,它将很好地工作:
for (int i = 0; i < 26; i++) {
char letter = (char) (i + 65);
Button button = new Button(String.valueOf(letter));
button.setOnAction(event -> letterGuess(letter));
alphabet.add(button);
}
您还可以在循环内将letter
声明为final
,但是在这种情况下没有必要。由于letter
在循环中只分配了一次值,因此有效地 final
,而兰巴知道它。
答案 1 :(得分:0)
variables
中使用的 lambda
必须为global
,final
或effectively final
。因此您可以使其最终定型,因为它在循环中是本地的:
final char letter = (char) (i+65);
OR
将letter
声明为全局变量。
答案 2 :(得分:0)
工作代码如下:
for(int i=0; i<26 ; i++) {
char letter = (char) (i+65);
alphabet.add(new Button("" + letter));
keyboard.getChildren().add(alphabet.get(i));
alphabet.get(i).setOnAction(e -> letterGuess(letter));
}
答案 3 :(得分:0)
List alphabets = IntStream.range(0, 26)
.mapToObj(i -> (char) (i + 65))
.map(l -> new Button(String.valueOf(l)))
.collect(Collectors.toList());
如果您是从手机上键入它,则可以在一行中原谅我的语法错误。