ventana - close stage javafx button
¿Cómo cerrar una aplicación JavaFX en la ventana cerrada? (11)
En Swing puedes simplemente usar setDefaultCloseOperation()
para cerrar toda la aplicación cuando la ventana está cerrada.
Sin embargo, en JavaFX no puedo encontrar un equivalente. Tengo varias ventanas abiertas y quiero cerrar toda la aplicación si se cierra una ventana. ¿Cuál es la forma de hacerlo en JavaFX?
Editar:
Entiendo que puedo anular setOnCloseRequest()
para realizar alguna operación al cerrar la ventana. La pregunta es: ¿qué operación se debe realizar para finalizar toda la aplicación?
stage.setOnCloseRequest(new EventHandler<WindowEvent>() {
@Override
public void handle(WindowEvent event) {
stop();
}
});
El método stop()
definido en la clase Application
no hace nada.
¿Has setOnCloseRequest esto ... setOnCloseRequest
setOnCloseRequest(EventHandler<WindowEvent> value)
Hay un example
Algunas de las respuestas proporcionadas no me funcionaron (javaw.exe todavía se está ejecutando después de cerrar la ventana) o, eclipse mostró una excepción después de que se cerró la aplicación.
Por otro lado, esto funciona perfectamente:
primaryStage.setOnCloseRequest(new EventHandler<WindowEvent>() {
@Override
public void handle(WindowEvent t) {
Platform.exit();
System.exit(0);
}
});
Como referencia, aquí hay una implementación mínima usando Java 8:
@Override
public void start(Stage mainStage) throws Exception {
Scene scene = new Scene(new Region());
mainStage.setWidth(640);
mainStage.setHeight(480);
mainStage.setScene(scene);
//this makes all stages close and the app exit when the main stage is closed
mainStage.setOnCloseRequest(e -> Platform.exit());
//add real stuff to the scene...
//open secondary stages... etc...
}
DEBE anular el método "stop ()" en su instancia de la Aplicación para que funcione. Si ha anulado incluso el vacío de "stop ()", la aplicación se cierra correctamente después de cerrar la última etapa (en realidad, la última etapa debe ser la etapa principal para que funcione completamente como debería). No se necesitan llamadas Platform.exit o setOnCloseRequest adicionales en ese caso.
Esto pareció funcionar para mí:
EventHandler<ActionEvent> quitHandler = quitEvent -> {
System.exit(0);
};
// Set the handler on the Start/Resume button
quit.setOnAction(quitHandler);
La aplicación se detiene automáticamente cuando se cierra la última Stage
. En este momento, se llama al método stop()
de su clase de Application
, por lo que no necesita un equivalente a setDefaultCloseOperation()
Si desea detener la aplicación antes de eso, puede llamar a Platform.exit()
, por ejemplo, en su llamada onCloseRequest
.
Puede obtener toda esta información en la página de Application
javadoc: http://docs.oracle.com/javafx/2/api/javafx/application/Application.html
Para mí, solo seguir está funcionando:
primaryStage.setOnCloseRequest(new EventHandler<WindowEvent>() {
@Override
public void handle(WindowEvent event) {
Platform.exit();
Thread start=new Thread(new Runnable() {
@Override
public void run() {
// TODO Auto-generated method stub
System.exit(0);
}
});
start.start();
}
});
Tratar
System.exit(0);
esto debería terminar el hilo principal y finalizar el programa principal
Usando Java 8 esto funcionó para mí:
@Override
public void start(Stage stage) {
Scene scene = new Scene(new Region());
stage.setScene(scene);
/* ... OTHER STUFF ... */
stage.setOnCloseRequest(e -> {
Platform.exit();
System.exit(0);
});
}
getContentPane.remove (jfxPanel);
intentalo (:
stage.setOnCloseRequest(new EventHandler<WindowEvent>() {
@Override
public void handle(WindowEvent event) {
Platform.exit();
System.exit(0);
}
}