【问题标题】:Lambda Expression Local variable text defined in an enclosing scope JavaFx在封闭范围 JavaFx 中定义的 Lambda 表达式局部变量文本
【发布时间】: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


【解决方案1】:

只需将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]);
    }
}

【讨论】:

  • 如果我制作一个新按钮,如何添加 i 和 j 的值?
  • @SakshamGoyal 我不明白您所说的“添加ij 的值”是什么意思。而且这段代码不会创建任何新按钮。
  • 向 OP 添加了完整代码。你明白我想做什么 npw 吗?
  • @SakshamGoyal 我真的不明白你想用字符串连接做什么,或者你为什么要在事件处理程序中重置text。目前尚不清楚您期望在那里发生什么。当按下按钮 (I,j) 时,您希望在按钮 (I,j) 中显示什么文本?
  • 你说:“当我从按钮网格中按下一个按钮时,它会将文本设置为二维数组中的位置”,这就是我的代码已发布。
猜你喜欢
  • 1970-01-01
  • 2016-11-13
  • 1970-01-01
  • 2018-02-11
  • 2017-04-21
  • 1970-01-01
  • 2013-11-01
相关资源
最近更新 更多