Лямбда-выражение Текст локальной переменной, определенный во вложенной области видимости JavaFx - PullRequest
0 голосов
/ 16 апреля 2020

Я использую JavaFX для создания игры тральщика. У меня есть лямбда-выражение, где (на данный момент), когда я нажимаю кнопку из сетки кнопок, она устанавливает текст кнопки в качестве местоположения в 2D-массиве. Я получаю сообщение об ошибке «Текст локальной переменной, определенный во внешней области видимости, должен быть окончательным или фактически окончательным».

Я понимаю, что переменные, которые я использую в лямбда-выражении, не могут быть выполнены, поскольку они должны быть окончательными снаружи выражение. но я не могу понять, как обойти это.

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, чтобы установить эти переменные как глобальные, но это не сработало.

1 Ответ

2 голосов
/ 16 апреля 2020

Просто переместите определение text в l oop (чтобы вы определяли новую, эффективно конечную, переменную на каждой итерации l oop). Вы также можете определить переменную 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]);
    }
}
...