2014-10-28 5 views
26

Я хочу сохранить файл перед закрытием приложения 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?

ответ

60

Если вы посмотрите на life-cycle из Application класса:

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

  1. Создает экземпляр указанный класс применения
  2. Вызов метода init()
  3. Вызывает start(javafx.stage.Stage) метод
  4. Уэйтса для приложения, чтобы закончить, что происходит, когда одно из следующих условий:
    • приложение вызывает Platform.exit()
    • последнее окно было закрыто, а атрибут на PlatformimplicitExit является true
  5. вызовов возможны 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() вам не нужно больше слушать, чтобы закрыть запросы, чтобы сохранить файл (хотя вы можете это сделать, если вы хотите, чтобы предотвратить закрытие окна).

Смежные вопросы