Добавление детей в панель после stage.show () - PullRequest
0 голосов
/ 15 ноября 2018

Я пишу простое игровое приложение на JavaFX и пытаюсь реализовать функцию перезапуска игры.Первоначально я думал, что нужно взять панель gameView, удалить ее дочерние элементы, а затем повторно добавить чистые.По какой-то причине это не работает.Есть ли другой способ добавления / удаления дочерних элементов в панели сцены после того, как сцена уже показана?

Метод запуска:

public void start(Stage primaryStage) {
    guessedLetters = new ArrayList<>();
    wrongGuesses = new ArrayList<>();

    gameView = getPane();

    primaryStage.setTitle("Hangman");
    Scene scene = new Scene(gameView);
    primaryStage.setScene(scene);
    //primaryStage.setResizable(false);
    primaryStage.show();
    primaryStage.setMinHeight(scene.getHeight());
    primaryStage.setMinWidth(scene.getWidth());
    primaryStage.sizeToScene();
}

Сброс логики:

 private void reset() {
            numMistakes = 0;
            guessedLetters.clear();
            wrongGuesses.clear();
            gameView.getChildren().clear();
            gameView = getPane();
            // ToDo: figure out how to reset pane
        }

getPane () инициализирует и возвращает новую панель gameView:

private BorderPane getPane() {
    // Text-input section
    lblInput = new Label("Guess a letter: ");
    tfInput = new TextField();

    tfInput.setOnAction(e -> play());
    guessInput = new HBox();
    guessInput.getChildren().addAll(lblInput, tfInput);
    guessInput.setAlignment(Pos.CENTER);


    gallows = new Gallows();
    gameBoard = buildGameBoard();
    centerScreen = new VBox();
    centerScreen.getChildren().addAll(gallows, gameBoard, guessInput);
    centerScreen.setSpacing(10);
    centerScreen.setAlignment(Pos.CENTER);
    centerScreen.setPadding(new Insets(5, 5, 5, 5));
    lblOutput = new Label();
    lblOutput.setFont(Font.font("Georgia", 15));

    gameView = new BorderPane();
    gameView.setCenter(centerScreen);
    gameView.setBottom(lblOutput);
    BorderPane.setAlignment(lblOutput, Pos.CENTER);

    return gameView;
}

Если нет, какие другие способы сброса сцены в окне (без открытия нового окна) доступны?

Любыепредложения приветствуются.

1 Ответ

0 голосов
/ 15 ноября 2018

Попробуйте это

Stage stage = (Stage) gameView.getScene().getWindow();
gameView = getPane();
stage.setScene(gameView);

Дополнительный вопрос: почему getPane возвращает gameView, даже если кажется, что gameView является переменной-членом, а не локальной переменной этого метода?

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...