【发布时间】:2020-04-16 00:27:49
【问题描述】:
我正在使用 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 和 text。
gridSize 是我的扫雷网格的大小。 buttonGrid 是我放置在 gridPane 中的按钮网格。
我在 stackoverflow 上看到了将这些变量设置为全局变量的解决方案,但这不起作用。
【问题讨论】:
-
java 中没有“全局”,即使您将变量转换为字段,这也不起作用。我不确定您要在这里实现什么,但即使假设您将结果复制到内部循环中的新变量/创建一个字段,逻辑似乎很奇怪:第一次单击按钮的文本按钮将更改为包含所有索引组合,对于删除文本后发生的所有点击...
-
@fabian 我已经添加了我的完整代码。希望这可以帮助您了解我在做什么
标签: java javafx lambda scope minesweeper