Вторичный этап JavaFX onCloseRequest

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

Вот что я делаю, но получаю исключение нулевого указателя:

   @Override
    public void initialize(URL location, ResourceBundle resources) {
        Stage stage = (Stage) tbTabPaneHome.getScene().getWindow();
        stage.setOnCloseRequest(e -> {
            Platform.exit();
            System.exit(0);
        });

    }

Поскольку сцена еще не полностью инициализирована, есть ли другие идеи?


person abdou amer    schedule 12.03.2016    source источник


Ответы (2)


Поскольку Scene и Stage еще не созданы, вы не можете их вызвать, иначе вы получите NPE, как вы уже упоминали.

Одним из способов установки обработчика событий на сцене будет прослушивание изменений в sceneProperty() из tbTabPaneHome.

Как только узел будет добавлен на сцену, это свойство даст вам экземпляр Scene.

Но сцена еще не добавлена ​​в Stage, поэтому вам нужно подождать, пока это будет сделано, с Platform.runLater():

public void initialize() {
    tbTabPaneHome.sceneProperty().addListener((obs, oldScene, newScene) -> {
        Platform.runLater(() -> {
            Stage stage = (Stage) newScene.getWindow();
            stage.setOnCloseRequest(e -> {
                Platform.exit();
                System.exit(0);
            });
        });
    });
}
person José Pereda    schedule 12.03.2016

Вы пытались полностью управлять своей вторичной сценой в контроллере основной сцены?

Я хочу скрыть или показать окна справки с помощью кнопки или меню справки в моем главном контроллере приложения. Что-то вроде следующего:

public Button helpBtn;
Stage anotherStage = new Stage();
boolean secondaryInitialyzed = false;
boolean secondaryShowing = false;
public void showOrHideHelp(ActionEvent actionEvent) throws IOException {
if (!secondaryInitialyzed){
    Parent anotherRoot = FXMLLoader.load(getClass().getResource("mySecondaryStage.fxml"));
    anotherStage.setTitle("Secondary stage");
    Scene anotherScene = new Scene(anotherRoot, 500, 350);
    anotherStage.setScene(anotherScene);
    secondaryInitialyzed = true;
}
if (secondaryShowing){
    anotherStage.hide();
    secondaryShowing = false;
    helpBtn.setText("Show Help");
}
else {
    anotherStage.show();
    secondaryShowing = true;
    helpBtn.setText("Hide Help");
}

Это работает, и у вас может быть способ обработать ваш setOnCloseRequest в главном контроллере.

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

У меня также есть другая, не связанная с этим проблема: могу ли я расположить вторичную ссылку на первичную?

person user2784655    schedule 16.05.2020