addeventhandler java javafx handler javafx-8

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:

  1. Construye una instancia de la clase de aplicación especificada
  2. Llama al método init()
  3. Llama al método start(javafx.stage.Stage)
  4. 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 en Platform es true
  5. 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).