it-swarm.com.de

Wie schließt man eine JavaFX-Anwendung beim Schließen des Fensters?

In Swing können Sie einfach mit setDefaultCloseOperation() die gesamte Anwendung herunterfahren, wenn das Fenster geschlossen wird.

In JavaFX kann ich jedoch keine Entsprechung 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 setOnCloseRequest() überschreiben kann, um eine Operation beim Schließen des Fensters auszuführen. Die Frage ist, welche Operation ausgeführt werden muss, um die gesamte Anwendung zu beenden.

stage.setOnCloseRequest(new EventHandler<WindowEvent>() {
    @Override
    public void handle(WindowEvent event) {
        stop();
    }
});

Die in Application-Klasse definierte stop()-Methode führt nichts aus.

61
Kshitiz Sharma

Die Anwendung wird automatisch angehalten, wenn die letzte Stage geschlossen wird. In diesem Moment wird die stop()-Methode Ihrer Application-Klasse aufgerufen, sodass Sie kein Äquivalent zu setDefaultCloseOperation() benötigen.

Wenn Sie die Anwendung vorher beenden möchten, können Sie Platform.exit() aufrufen, z. B. in Ihrem Aufruf onCloseRequest.

Sie finden alle diese Informationen auf der Javadoc-Seite von Application: http://docs.Oracle.com/javafx/2/api/javafx/application/Application.html

70
Teocali

Einige der bereitgestellten Antworten funktionierten nicht für mich (javaw.exe wurde nach dem Schließen des Fensters noch ausgeführt) oder Eclipse zeigte eine Ausnahme, nachdem die Anwendung geschlossen wurde.

Andererseits funktioniert das perfekt:

primaryStage.setOnCloseRequest(new EventHandler<WindowEvent>() {
    @Override
    public void handle(WindowEvent t) {
        Platform.exit();
        System.exit(0);
    }
});
40
Cyrus13

Als Referenz dient 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...
}
23
Pierre Henry
stage.setOnCloseRequest(new EventHandler<WindowEvent>() {
    @Override
    public void handle(WindowEvent event) {
        Platform.exit();
        System.exit(0);
    }
}
17
Om Prakash

Haben Sie dies versucht .. setOnCloseRequest

setOnCloseRequest(EventHandler<WindowEvent> value)   

Es gibt ein Beispiel

3
Sumit Singh

Mit Java 8 funktionierte das für mich:

@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);
    });
}
2
madx

Anstatt mit onCloseRequest-Handlern oder Fensterereignissen herumzuspielen, rufe ich Platform.setImplicitExit(true) lieber am Anfang der Anwendung auf.

Gemäß JavaDocs:

"Wenn dieses Attribut wahr ist, wird die JavaFX-Laufzeit implizit beendet, wenn das letzte Fenster geschlossen wird. Der JavaFX-Launcher ruft die Application.stop () -Methode auf und beendet den JavaFX-Anwendungsthread."

Beispiel:

@Override
void start(Stage primaryStage) {
    Platform.setImplicitExit(true)
    ...
    // create stage and scene
}
1
Daniel Ferber

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);
0
Eddy Zavala

getContentPane.remove (jfxPanel); 

versuch es (:

0

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();
            }

        });
0
Piyush Aghera

Versuchen

 System.exit(0);

dies sollte den Thread main beenden und das Hauptprogramm beenden

0
DENNIS KITHINJI