Подтвердить что ты не робот

JavaFX: обработчик завершения этапа

Я хочу сохранить файл перед закрытием приложения JavaFX.

Вот как я настраиваю обработчик в Main::start:

primaryStage.setOnCloseRequest(event -> {
    System.out.println("Stage is closing");
    // Save file
});

И контроллер, вызывающий Stage::close при нажатии кнопки:

@FXML
public void exitApplication(ActionEvent event) {
    ((Stage)rootPane.getScene().getWindow()).close();
}

Если я закрою окно, щелкнув по красному X на границе окна (обычным способом), я получу выходное сообщение "Stage is closing", что является желаемым поведением.

Однако при вызове Controller::exitApplication приложение закрывается без вызова обработчика (нет выхода).

Как я могу заставить контроллер использовать обработчик, который я добавил в primaryStage?

4b9b3361

Ответ 1

Если вы посмотрите жизненный цикл класса Application:

Время выполнения JavaFX делает следующее, в порядке, когда запускается приложение:

  • Создает экземпляр указанного класса Application
  • Вызывает метод init()
  • Вызывает метод start(javafx.stage.Stage)
  • Ожидает завершения работы приложения, которое происходит, когда происходит одно из следующих событий:
    • приложение вызывает Platform.exit()
    • последнее окно было закрыто, а атрибут implicitExit на Platform - true
  • Вызывает метод stop()

Это означает, что вы можете вызывать Platform.exit() на вашем контроллере:

@FXML
public void exitApplication(ActionEvent event) {
   Platform.exit();
}

если вы переопределите метод stop() основного класса, чтобы сохранить файл.

@Override
public void stop(){
    System.out.println("Stage is closing");
    // Save file
}

Как вы можете видеть, с помощью stop() вам больше не нужно слушать запросы на закрытие, чтобы сохранить файл (хотя вы можете сделать это, если хотите предотвратить закрытие окна).