2014-10-28 14 views
26

Desidero salvare un file prima di chiudere la mia applicazione JavaFX.JavaFX: Stage close handler

Questo è il modo Sto installando il gestore in Main::start:

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

E il controller chiamando Stage::close quando si preme un tasto:

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

Se chiudo la finestra cliccando sul rosso X sul bordo della finestra (nel modo normale) quindi viene visualizzato il messaggio di output "Stage is closing", che è il comportamento desiderato.

Tuttavia, quando si chiama Controller::exitApplication l'applicazione si chiude senza richiamare il gestore (non c'è output).

Come posso fare in modo che il controller usi il gestore che ho aggiunto a primaryStage?

risposta

60

Se si dispone di uno sguardo al life-cycle della classe Application:

Il runtime JavaFX esegue le seguenti operazioni, in ordine, ogni volta che un'applicazione è lanciato:

  1. costruisce un esempio di la classe di applicazione specificata
  2. Chiama il metodo init()
  3. Chiama lo start(javafx.stage.Stage) metodo
  4. attende l'applicazione termini, che avviene quando una delle seguenti situazioni:
    • l'applicazione chiama Platform.exit()
    • l'ultima finestra è stata chiusa e l'attributo implicitExit su Platform è true
  5. chiama il metodo

Ciò significa che è possibile chiamare Platform.exit() sul controller:

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

il tempo che l'override del metodo stop() sulla classe principale per salvare il file.

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

Come si può vedere, utilizzando stop() non c'è bisogno di ascoltare per chiudere le richieste per salvare il file di più (anche se si può fare se si vuole impedire la chiusura della finestra).