addeventhandler javafx
JavaFX: controlador de etapa cercana (1)
Quiero guardar un archivo antes de cerrar mi aplicación JavaFX.
Así es como estoy configurando el controlador en Main::start :
primaryStage.setOnCloseRequest(event -> {
System.out.println("Stage is closing");
// Save file
});
Y el controlador que llama a Stage::close cuando se presiona un botón:
@FXML
public void exitApplication(ActionEvent event) {
((Stage)rootPane.getScene().getWindow()).close();
}
Si cierro la ventana y hago clic en la X roja en el borde de la ventana (de la manera normal), aparece el mensaje de salida "La Stage is closing ", que es el comportamiento deseado.
Sin embargo, al llamar a Controller::exitApplication la aplicación se cierra sin invocar el controlador (no hay salida).
¿Cómo puedo hacer que el controlador use el controlador que agregué a primaryStage ?
Si echas un vistazo al life-cycle de life-cycle de la clase de Application :
El tiempo de ejecución de JavaFX hace lo siguiente, en orden, siempre que se inicia una aplicación:
- Construye una instancia de la clase de aplicación especificada
- Llama al método
init()- Llama al método
start(javafx.stage.Stage)- Espera a que la aplicación finalice, lo que sucede cuando ocurre cualquiera de las siguientes situaciones:
- la aplicación llama a
Platform.exit()- la última ventana se ha cerrado y el atributo
implicitExitenPlatformestrue- Llama al método
stop()
Esto significa que puede llamar a Platform.exit() en su controlador:
@FXML
public void exitApplication(ActionEvent event) {
Platform.exit();
}
siempre que anule el método stop() en la clase principal para guardar el archivo.
@Override
public void stop(){
System.out.println("Stage is closing");
// Save file
}
Como puede ver, al usar stop() no necesita escuchar cerrar solicitudes para guardar el archivo (aunque puede hacerlo si desea evitar el cierre de la ventana).