【问题标题】:JavaFX Array of Buttons that Dissapear when clicked单击时消失的 JavaFX 按钮数组
【发布时间】:2021-01-07 12:51:26
【问题描述】:

我们正在尝试制作一组​​按钮,当它们被点击时会消失。问题是,无论我们点击哪个按钮,都会出现越界错误。如果我们单击 button(1,3),我们希望该按钮消失(通过使用 remove 功能)。

这是我们当前的代码:

public class Main extends Application {
public static void main(String[] args) {
    
    System.out.println("Start of JavaFX");
    launch(args);
    System.out.println("End of JavaFX");
}
//--module-path "/Users/jonathan/Documents/JavaFX/javafx-sdk-15.0.1/lib" --add-modules 
javafx.controls,javafx.fxml

private int width = 10;
private int height = 10;

private int i;
private int j;

private StackPane[][] stk = new StackPane[width][height];
Button[][] button = new Button[width][height];
Label[][] lbl = new Label[width][height];
       
@Override public void start(Stage primaryStage) {
   
   GridPane gridPane = new GridPane();
   
   for (i = 0 ; i <= width-1 ; i++) {
       for (j = 0 ; j <= height-1 ; j++) {
           
           //System.out.println(i + "," + j);
           
           button[i][j] = new Button();
           lbl[i][j] = new Label();            
           
           button[i][j].setText("B");
           lbl[i][j].setText("X");
           
           stk[i][j] = new StackPane(lbl[i][j],button[i][j]);
           
           gridPane.add(stk[i][j], i, j, 1, 1);    
           button[i][j].setOnAction(e -> buttonClick(i,j));
       }   
   }
   
   
   Scene scene = new Scene(gridPane);
   primaryStage.setScene(scene);
   
   primaryStage.show();
 
}

public void buttonClick(int i, int j) {
   System.out.println(i + "," + j);
   stk[i][j].getChildren().remove(button[i][j]);
   
}


}

【问题讨论】:

  • 这实际上是一个可重现的例子,我很好地重现了它并且能够找到解决方案(我也在下面发布)!忽略彼得上面的评论。
  • @jetspiking 看起来不像......但仔细观察,可能是格式问题;)无论如何,我希望 OP 付出更多努力来使代码可读。跨度>

标签: arrays button javafx


【解决方案1】:

问题是你可能在直接在其中创建变量时故意绕过了 for 循环中的警告“lambda 表达式中使用的变量应该是最终的或有效的最终”。在此循环之上使其最终导致问题。

现在 i 和 j 索引一直在变化,直到你在 for 循环中的最后一次迭代(即 10、10)。每个按钮都使用相同的变量,而不是为每个单独的按钮创建一个新的自变量。

解决方案是为每个按钮创建一个新的(最终)变量:

代码(注意您现在如何在 for 循环中创建变量“i”和“j”):

for (int i = 0 ; i <= width-1 ; i++) {
        for (int j = 0 ; j <= height-1 ; j++) {

            button[i][j] = new Button();
            lbl[i][j] = new Label();

            button[i][j].setText("B");
            lbl[i][j].setText("X");

            stk[i][j] = new StackPane(lbl[i][j],button[i][j]);

            final int indexI = i; // _SOLUTION_
            final int indexJ = j; // _SOLUTION_

            gridPane.add(stk[i][j], i, j, 1, 1);
            button[i][j].setOnAction(e -> buttonClick(indexI,indexJ)); // _SOLUTION_
        }
    }

运行应用程序:

点击几个按钮时的输出,注意“10,10”不再打印:

【讨论】:

    猜你喜欢
    • 2017-03-03
    • 1970-01-01
    • 2011-03-15
    • 2015-11-28
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多