我希望网格上的所有按钮从空白更改为X到O,然后每次单击时返回空白。它目前只适用于数组中的第一个元素,因为I和j的值都是0.我是否需要一个类似于初始化按钮的循环?
我虽然我需要添加两个嵌套的for循环,但是我已经尝试了这个并且它已经有用了。
有什么建议吗?
答案 0 :(得分:2)
您使用最终字段i
和j
用于设置事件处理程序。如果您希望使用所有按钮处理单击相同的方式,则需要将事件处理程序注册到每个按钮。
由于你只能有效地访问循环内的最终变量,你需要制作循环变量的最终副本,或者只是为Button
声明一个局部变量。
final List<String> values = Arrays.asList("", "X", "O");
for(int i=0; i<btn.length; i++){
for(int j=0; j<btn.length;j++){
final Button button = new Button("");
button.setOnAction(event -> {
int valueIndex = values.indexOf(button.getText());
button.setText(values.get((valueIndex+1) % values.size()));
});
// Initializing 2D buttons with values i,j
btn[i][j] = button;
button.setPrefSize(35, 40);
gridPane.add(button, i, j);
// button.setDisable(false);
}
}
答案 1 :(得分:0)
您可以定义单个事件处理程序并将其分配给循环中的所有按钮
EventHandler<ActionEvent> eventHandler = new EventHandler<ActionEvent>() {
@Override
public void handle(ActionEvent event) {
Button button = (Button) event.getSource();
switch (button.getText()) {
case "":
button.setText("X");
break;
case "X":
button.setText("O");
break;
default:
button.setText("");
break;
}
}
};
//Two FOR loops used for creating 2D array of buttons with values i,j
for(int i=0; i<btn.length; i++){
for(int j=0; j<btn.length;j++){
// Initializing 2D buttons with values i,j
btn[i][j] = new Button();
btn[i][j].setPrefSize(35, 40);
gridPane.add(btn[i][j], i, j);
btn[i][j].setText("");
btn[i][j].setDisable(false);
btn[i][j].setOnAction(eventHandler);
}
}