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
implicitExit
enPlatform
estrue
- 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).