Java 如何将二维数组填充为相同的值

Java 如何将二维数组填充为相同的值,java,javafx,Java,Javafx,我希望我的网格上的所有按钮都从空白变为X到O,然后每次单击都变回空白。它当前仅适用于数组中的第一个元素,因为I和j的值都是0。我是否需要一个类似于初始化按钮的循环 我认为这两个嵌套的for循环是我需要添加的,但是我已经尝试过了,并且成功了 有什么建议吗?您可以定义单个事件处理程序并将其分配给循环中的所有按钮 EventHandler<ActionEvent> eventHandler = new EventHandler<ActionEvent>() {

我希望我的网格上的所有按钮都从空白变为X到O,然后每次单击都变回空白。它当前仅适用于数组中的第一个元素,因为I和j的值都是0。我是否需要一个类似于初始化按钮的循环

我认为这两个嵌套的for循环是我需要添加的,但是我已经尝试过了,并且成功了


有什么建议吗?

您可以定义单个事件处理程序并将其分配给循环中的所有按钮

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);
        }        
}
EventHandler EventHandler=neweventhandler(){
@凌驾
公共无效句柄(ActionEvent事件){
Button Button=(Button)event.getSource();
开关(button.getText()){
案例“”:
按钮设置文本(“X”);
打破
案例“X”:
按钮。设置文本(“O”);
打破
违约:
按钮。setText(“”);
打破
}
}
};
//两个FOR循环用于创建具有值i、j的按钮的二维数组

对于(inti=0;i,可以定义单个事件处理程序并将其分配给循环中的所有按钮

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);
        }        
}
EventHandler EventHandler=neweventhandler(){
@凌驾
公共无效句柄(ActionEvent事件){
Button Button=(Button)event.getSource();
开关(button.getText()){
案例“”:
按钮设置文本(“X”);
打破
案例“X”:
按钮。设置文本(“O”);
打破
违约:
按钮。setText(“”);
打破
}
}
};
//两个FOR循环用于创建具有值i、j的按钮的二维数组

对于(int i=0;i您使用最终字段
i
j
来设置事件处理程序。如果您希望所有按钮都以相同的方式处理单击,则需要将事件处理程序注册到每个按钮

由于您只能有效地访问循环中的最终变量,因此需要创建循环变量的最终副本,或者只需为
按钮
声明一个局部变量

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);
    }
}
final List value=Arrays.asList(“,“X”,“O”);

对于(int i=0;i您使用最终字段
i
j
来设置事件处理程序。如果您希望所有按钮都以相同的方式处理单击,则需要将事件处理程序注册到每个按钮

由于您只能有效地访问循环中的最终变量,因此需要创建循环变量的最终副本,或者只需为
按钮
声明一个局部变量

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);
    }
}
final List value=Arrays.asList(“,“X”,“O”);

对于(inti=0;iYou可以使用:
for(Foo[]数组:my2dArray){Arrays.fill(array,someValue);}
在我的程序中它会去哪里?忘记那个注释。你需要使用不同的
按钮实例。所以每个数组位置都有一个不同的实例?每个要添加到场景中的按钮都有一个不同的实例。你不能多次将同一节点添加到场景中。你可以使用:
for(Foo[]数组:my2dArray){Arrays.fill(数组,someValue);}
在我的程序中它会去哪里?忘记那个注释。你需要使用不同的
按钮实例。所以每个数组位置都有一个不同的实例?每个要添加到场景中的按钮都有一个不同的实例。你不能多次将同一个节点添加到场景中。这是一个JavaFX问题。但不管t、 为什么要这样做?您可以将事件处理程序添加到创建它们的循环中的每个按钮上,并避免事件源中令人难堪的降级。@James_D将JButton更改为button.My bad。@James_D与您的其他语句相关联……您可以在自己的类中定义匿名事件处理程序,并在loo中创建新实例p(你在这一点上是对的)。正如您所发现的,我来自Swing,简单的向下投射中没有这种丑陋。这是一个主观的问题。这是一个JavaFX问题。但不管怎样,为什么要这样做?您可以将事件处理程序添加到创建它们的循环中的每个按钮中,并避免从事件源进行丑陋的向下投射。@James_D将JButton更改为B“utton.My bad.@James_D与您的其他语句相关……您可以在自己的类中定义匿名事件处理程序,并在循环中创建一个新实例(这一点您是对的)”.正如你所发现的,我来自Swing,在一次简单的沮丧中没有那么丑陋。那是主观的感觉。太好了!谢谢你的帮助!太好了!谢谢你的帮助!