JavaFX使用for循环将操作分配给数组数组中的所有按钮

JavaFX Assigning action to all buttons in an array of arrays using for-loop

我们有这个热身练习,我们应该创建这个非常简单的游戏,UI 已经基本设置好了

.

我收到错误 “我在封闭范围内定义的局部变量必须是最终的或实际上是最终的”。

没看懂,google了一下,大部分问题都不一样。 在输入这个问题时,我在 Whosebug 建议中发现了这个:

但我就是不明白。我正在从头开始学习 programming/java。我希望 JavaFX/GuI 东西不是障碍?

下面的代码只包括我尝试分配的动作。我暂时将它与按钮的创建分开,以找出问题所在。问题仅在 if 和 else 条件下。

    for(int i=0; i<=4; i++) {

        for(int j=0; j<=4; j++) {

            buttonGrid[i][j].setOnAction(new EventHandler<ActionEvent>() {
                public void handle(ActionEvent event) {
                    
                    if (buttonGrid[i][j].getText() == "X") {
                        buttonGrid[i][j].setText("O");
                    } else {
                        buttonGrid[i][j].setText("X");
                    }
                }
            });
         }
    }

现在我只希望按钮的标签在您单击它们时从 X 变为 O,然后从 O 变为 X。顺便提一句。如果我学习 JavaFX 和 GUI,是否意味着我必须学习 css? (不是我不想,只是..不是现在)

如果需要其余代码来解决问题: http://textuploader.com/5b1kh

如果有人能告诉我如何以更有效的方式制作场景,我将不胜感激。 (顺便说一句,我能以某种方式锁定网格窗格所有单元格边的纵横比吗?)

我认为这个问题的答案很好地解释了你的问题以及如何解决它Problems with local variable scope. How to solve it?你不能在 Action 处理程序中使用 i 和 j。

试试这个。 [注意我还更改了字符串比较*]

 for(int i=0; i<=4; i++) {

    for(int j=0; j<=4; j++) {

        final Button myButton = buttonGrid[i][j];

        myButton.setOnAction(new EventHandler<ActionEvent>() {
            public void handle(ActionEvent event) {
                if ("X".equals(myButton.getText())) {
                    myButton.setText("O");
                } else {
                    myButton.setText("X");
                }
            }
        });
    }
} 

[*] How do I compare strings in Java?