web-dev-qa-db-fra.com

Comment fermer une application JavaFX à la fermeture de la fenêtre?

Dans Swing, vous pouvez simplement utiliser setDefaultCloseOperation() pour fermer l’application entière lorsque la fenêtre est fermée.

Cependant, en JavaFX, je ne trouve pas d’équivalent. J'ai plusieurs fenêtres ouvertes et je veux fermer toute l'application si une fenêtre est fermée. Quel est le moyen de faire cela dans JavaFX?

Modifier:

Je comprends que je peux remplacer setOnCloseRequest() pour effectuer certaines opérations à la fermeture de la fenêtre. La question est quelle opération doit être effectuée pour mettre fin à l'application entière?

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

La méthode stop() définie dans la classe Application ne fait rien.

61
Kshitiz Sharma

L'application s'arrête automatiquement à la fermeture de la dernière Stage. En ce moment, la méthode stop() de votre classe Application est appelée, vous n'avez donc pas besoin d'équivalent à setDefaultCloseOperation()

Si vous souhaitez arrêter l'application avant cela, vous pouvez appeler Platform.exit(), par exemple dans votre appel onCloseRequest.

Vous pouvez avoir toutes ces informations sur la page javadoc de Application: http://docs.Oracle.com/javafx/2/api/javafx/application/Application.html

70
Teocali

Certaines des réponses fournies ne fonctionnaient pas pour moi (javaw.exe étant toujours en cours d'exécution après la fermeture de la fenêtre) ou Eclipse a affiché une exception après la fermeture de l'application.

Par contre, cela fonctionne parfaitement:

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

Pour référence, voici une implémentation minimale utilisant 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

Avez-vous essayé ceci .. setOnCloseRequest

setOnCloseRequest(EventHandler<WindowEvent> value)   

Il y a un exemple

3
Sumit Singh

En utilisant Java 8 cela a fonctionné pour moi:

@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

Au lieu de jouer avec les gestionnaires onCloseRequest ou les événements de fenêtre, je préfère appeler Platform.setImplicitExit(true) le début de l'application.

Selon JavaDocs:

"Si cet attribut a la valeur true, le runtime JavaFX s’arrête implicitement à la fermeture de la dernière fenêtre; le programme de lancement JavaFX appelle la méthode Application.stop () et termine le thread d’application JavaFX."

Exemple:

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

Cela a semblé fonctionner pour moi:

EventHandler<ActionEvent> quitHandler = quitEvent -> {

        System.exit(0);

    };
    // Set the handler on the Start/Resume button
    quit.setOnAction(quitHandler);
0
Eddy Zavala

getContentPane.remove (jfxPanel); 

essayez-le (:

0

Pour moi, seul ce qui suit fonctionne:

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

Essayer

 System.exit(0);

cela devrait mettre fin au fil principal et au programme principal

0
DENNIS KITHINJI