Lambda表达式在封闭范围JavaFx中定义的局部变量文本

问题描述 投票:0回答:1

我正在使用JavaFX创建扫雷游戏。我有一个lambda表达式,当我按一下按钮网格中的按钮时(现在),它将按钮的文本设置为2D数组中的位置。我收到错误消息“在封闭范围内定义的局部变量文本必须是最终的或实际上是最终的。”

我知道在lambda表达式中使用的变量无法完成,因为它们必须在表达式外部为最终变量。但我不知道该如何解决。

static Stage stage;
Button[][] buttonGrid;

public void start(Stage primaryStage) throws Exception {
    SetSettings.readSettings();
    GridPane gridpane = new GridPane();

    int gridSize = Minesweeper.gridSize;
    buttonGrid = new Button[gridSize][gridSize];
    for (int i = 0; i < gridSize; i++) {
        for (int j = 0; j < gridSize; j++) {
            buttonGrid[i][j] = new Button();
            GridPane.setConstraints(buttonGrid[i][j], j, i);

        }
    }
    String text = "";
    for (int i = 0; i < gridSize; i++) {
        for (int j = 0; j < gridSize; j++) {
            text += i + "" + j;
            buttonGrid[i][j].setOnAction(e -> {
                buttonGrid[i][j].setText(text);
                text = "";

            });
            gridpane.getChildren().add(buttonGrid[i][j]);
        }
    }

    stage = primaryStage;
    primaryStage.setOnCloseRequest(e -> {
        e.consume();
        ConfirmExit.display("Exit", "Are you sure you want to quit this game?");
    });
    primaryStage.setTitle("Minesweeper");
    stage.getIcons().add(new Image("/Logo.jpg"));
    Scene scene = new Scene(gridpane, 600, 500);
    primaryStage.setScene(scene);
    primaryStage.show();
}


public static void main(String[] args) {
    launch(args);
}

它在同一错误中标记i,j和文本。

gridSize是扫雷车的网格尺寸。 buttonGrid是我在gridPane中放置的按钮的网格。

我看到了一个关于stackoverflow的解决方案,将这些变量设置为全局变量,但这没有用。

java javafx lambda scope minesweeper
1个回答
0
投票

只需在循环内移动text的定义即可(因此,您可以在循环的每次迭代中定义一个新的,有效的最终变量)。您也可以用相同的方式定义Button变量,以避免引用ij

for (int i = 0; i < gridSize; i++) {
    for (int j = 0; j < gridSize; j++) {
        String text = i + "" + j;
        Button button = buttonGrid[i][j] ;
        button.setOnAction(e -> {
            button.setText(text);    
        });
        gridpane.getChildren().add(buttonGrid[i][j]);
    }
}
© www.soinside.com 2019 - 2024. All rights reserved.