我正在使用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的解决方案,将这些变量设置为全局变量,但这没有用。
只需在循环内移动text
的定义即可(因此,您可以在循环的每次迭代中定义一个新的,有效的最终变量)。您也可以用相同的方式定义Button
变量,以避免引用i
和j
:
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]);
}
}