I want to save a file before closing my JavaFX application.
This is how I'm setting up the handler in Main::start
:
primaryStage.setOnCloseRequest(event -> { System.out.println("Stage is closing"); // Save file });
And the controller calling Stage::close
when a button is pressed:
@FXML public void exitApplication(ActionEvent event) { ((Stage)rootPane.getScene().getWindow()).close(); }
If I close the window clicking the red X on the window border (the normal way) then I get the output message "Stage is closing
", which is the desired behavior.
However, when calling Controller::exitApplication
the application closes without invoking the handler (there's no output).
How can I make the controller use the handler I've added to primaryStage
?
As hide() is equivalent to close() and close() closes the stage, then hide() also closes the stage. When all stages in an application are hidden (or closed if you like, because it is the same thing), the application exits.
A Stage in JavaFX is a top-level container that hosts a Scene, which consists of visual elements. The Stage class in the javafx. stage package represents a stage in a JavaFX application. The primary stage is created by the platform and passed to the start(Stage s) method of the Application class.
If you have a look at the life-cycle of the Application
class:
The JavaFX runtime does the following, in order, whenever an application is launched:
- Constructs an instance of the specified Application class
- Calls the
init()
method- Calls the
start(javafx.stage.Stage)
method- Waits for the application to finish, which happens when either of the following occur:
- the application calls
Platform.exit()
- the last window has been closed and the
implicitExit
attribute onPlatform
istrue
- Calls the
stop()
method
This means you can call Platform.exit()
on your controller:
@FXML public void exitApplication(ActionEvent event) { Platform.exit(); }
as long as you override the stop()
method on the main class to save the file.
@Override public void stop(){ System.out.println("Stage is closing"); // Save file }
As you can see, by using stop()
you don't need to listen to close requests to save the file anymore (though you can do it if you want to prevent window closing).
If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!
Donate Us With