2014-10-28 9 views
26

Ich möchte eine Datei speichern, bevor ich meine JavaFX-Anwendung schließe. DieseJavaFX: Schließen der Stage-Prozedur

ist, wie ich die Handler in Main::start einrichten:

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

Und die Controller Aufruf Stage::close, wenn eine Taste gedrückt wird:

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

Wenn ich das Fenster schließe die roten klicken X am Fensterrand (der normale Weg) dann bekomme ich die Ausgabenachricht "Stage is closing", was das gewünschte Verhalten ist.

Beim Aufruf von Controller::exitApplication wird jedoch die Anwendung geschlossen, ohne den Handler aufzurufen (es gibt keine Ausgabe).

Wie kann ich veranlassen, dass der Controller den Handler verwendet, den ich zu primaryStage hinzugefügt habe?

Antwort

60

Wenn Sie einen Blick auf die life-cycle der Application Klasse:

Die JavaFX Runtime hat die folgenden, um, wenn ein Anwendung gestartet:

  1. Konstrukten eine Instanz die angegebene Anwendungsklasse
  2. Aufrufe der init() Methode
  3. Ruft die start(javafx.stage.Stage) Verfahren
  4. Wartet für die Anwendung zu beenden, die, wenn sie auftreten, entweder der folgenden Ereignisse eintritt:
    • ruft die Anwendung Platform.exit()
    • das letzte Fenster und das implicitExit Attribut Platform geschlossen worden ist, ist true
  5. fordert die stop() Methode

Das heißt, Sie Platform.exit() auf dem Controller anrufen:

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

, solange Sie die stop() Methode auf der Hauptklasse außer Kraft setzen, die Datei zu speichern.

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

Wie Sie sehen können, durch stop() verwenden Sie müssen auf Anfragen nicht hören zu schließen, die Datei speichern mehr (obwohl Sie können es tun, wenn Sie Fenster Schließung verhindern wollen).