2014-10-28 82 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

如果你看看Application類的life-cycle

JavaFX運行執行以下操作,才能,每當 啓動應用程序:

  1. 構建的一個實例指定的應用程序類別
  2. 致電init()方法
  3. 致電start(javafx.stage.Stage)方法
  4. 等待應用程序來完成,當下面的任一發生這恰好:
    • 應用程序調用Platform.exit()
    • 最後一個窗口已被關閉並在PlatformimplicitExit屬性是true
  5. 調用stop()方法
只要

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

爲你重寫主類stop()方法來保存文件:

這意味着您可以在控制器上調用Platform.exit()

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

正如你所看到的,通過使用stop()你不需要聽關閉請求保存文件了(儘管你可以做到這一點,如果你想防止窗口關閉)。