如何在for循环中使用每个按钮的lamda表达式制作按钮?

时间:2019-04-22 03:17:35

标签: java javafx local-variables

我正在尝试用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(字母));该错误表明:在封闭范围内定义的局部变量字母必须是最终的或实际上是最终的

4 个答案:

答案 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必须为globalfinaleffectively 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());

如果您是从手机上键入它,则可以在一行中原谅我的语法错误。