2014-10-28 18 views
26

Chcę zapisać plik przed zamknięciem aplikacji JavaFX.JavaFX: Stage close handler

jest to jak mam konfigurowania obsługi w Main::start:

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

a kontroler dzwoni Stage::close po naciśnięciu przycisku:

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

Gdybym zamknąć okno klikając czerwony X na granicy okna (normalny sposób), a następnie otrzymuję komunikat wyjściowy "Stage is closing", co jest pożądanym zachowaniem.

Jednak po wywołaniu Controller::exitApplication aplikacja zamyka się bez wywoływania programu obsługi (nie ma danych wyjściowych).

W jaki sposób można użyć kontrolera, który został dodany do primaryStage?

Odpowiedz

60

Jeśli spojrzeć na life-cycle klasy Application:

JavaFX wykonawcze nie dodaje się w porządku, gdy aplikacja jest uruchomiona:

  1. Konstrukcje instancją podana klasa aplikacji
  2. Wywołuje Połączenia start(javafx.stage.Stage) metoda
  3. czeka na zgłoszenia do końca, co zdarza się, gdy jeden z poniższych warunków:
    • aplikacja wywołuje Platform.exit()
    • ostatnie okno zostało zamknięte, a atrybut implicitExit na Platform jest true
  4. wywołuje metodę

Oznacza to, że można zadzwonić Platform.exit() na kontrolerze:

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

tak długo, jak zastąpić metodę stop() na głównej klasie, aby zapisać plik.

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

Jak widać, za pomocą stop() nie trzeba słuchać, aby zamknąć żądania, aby zapisać plik już (choć można to zrobić, jeśli chcesz, aby zapobiec zamknięciu okna).