In Swing können Sie einfach setDefaultCloseOperation()
die gesamte Anwendung herunterfahren, wenn das Fenster geschlossen wird.
In JavaFX kann ich jedoch kein Äquivalent finden. Ich habe mehrere Fenster geöffnet und möchte die gesamte Anwendung schließen, wenn ein Fenster geschlossen wird. Wie geht das in JavaFX?
Bearbeiten:
Ich verstehe, dass ich überschreiben kann setOnCloseRequest()
, um eine Operation beim Schließen des Fensters auszuführen. Die Frage ist, welche Operation ausgeführt werden sollte, um die gesamte Anwendung zu beenden.
stage.setOnCloseRequest(new EventHandler<WindowEvent>() {
@Override
public void handle(WindowEvent event) {
stop();
}
});
Die stop()
in Application
class definierte Methode führt nichts aus.
implicitExit
Attribut on auf gesetztPlatform
isttrue
.Einige der bereitgestellten Antworten funktionierten bei mir nicht (javaw.exe wird nach dem Schließen des Fensters noch ausgeführt) oder Eclipse zeigte nach dem Schließen der Anwendung eine Ausnahme.
Auf der anderen Seite funktioniert das perfekt:
primaryStage.setOnCloseRequest(new EventHandler<WindowEvent>() { @Override public void handle(WindowEvent t) { Platform.exit(); System.exit(0); } });
quelle
System.exit(0);
einzige, was dazu führte, dass der Prozess nach dem Schließen des Hauptfensters beendet wurde.ExecutorService
wie @Manius einen eigenen (dh einen Thread-Pool) starten, müssen Sie diesen explizit herunterfahren (wenn der Thread ein Nicht-Daemon ist). Sie können dies in der#stop()
Methode Ihrer Anwendungsklasse tun , wenn Sie möchten. JavaFX verwaltet jedoch keineExecutorService
Instanzen (oder andere Thread-erstellende Parallelitätsdienstprogramme).Als Referenz ist hier eine minimale Implementierung mit 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... }
quelle
stage.setOnCloseRequest(new EventHandler<WindowEvent>() { @Override public void handle(WindowEvent event) { Platform.exit(); System.exit(0); } });
quelle
Haben Sie dies versucht .. setOnCloseRequest
Es gibt ein Beispiel
quelle
Mit Java 8 hat das bei mir funktioniert:
@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); }); }
quelle
Anstatt mit onCloseRequest-Handlern oder Fensterereignissen herumzuspielen, rufe ich lieber
Platform.setImplicitExit(true)
den Anfang der Anwendung auf.Laut JavaDocs:
Beispiel:
@Override void start(Stage primaryStage) { Platform.setImplicitExit(true) ... // create stage and scene }
quelle
The default value is true.
Für mich funktioniert nur folgendes:
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(); } });
quelle
Das schien für mich zu funktionieren:
EventHandler<ActionEvent> quitHandler = quitEvent -> { System.exit(0); }; // Set the handler on the Start/Resume button quit.setOnAction(quitHandler);
quelle
Versuchen
System.exit(0);
Dies sollte Thread main beenden und das Hauptprogramm beenden
quelle
getContentPane.remove (jfxPanel);
Versuch es (:
quelle
Sie MÜSSEN die Methode "stop ()" in Ihrer Anwendungsinstanz überschreiben, damit sie funktioniert. Wenn Sie sogar leeres "stop ()" überschrieben haben, wird die Anwendung ordnungsgemäß geschlossen, nachdem die letzte Stufe geschlossen wurde (tatsächlich muss die letzte Stufe die primäre Stufe sein, damit sie vollständig wie vorgesehen funktioniert). In diesem Fall sind keine zusätzlichen Platform.exit- oder setOnCloseRequest-Aufrufe erforderlich.
quelle