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

Dans Swing, vous pouvez simplement utiliser setDefaultCloseOperation() pour arrêter toute l'application lorsque la fenêtre est fermée.

Cependant, dans 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. Quelle est la façon de le faire dans JavaFX?

Modifier:

Je comprends que je peux remplacer setOnCloseRequest() pour effectuer une opération à la fermeture de la fenêtre. La question Est de savoir quelle opération doit être effectuée pour terminer l'ensemble application?

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.

60
demandé sur Kshitiz Sharma 2012-08-28 10:10:00

11 réponses

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

Si vous voulez arrêter l'application avant que, vous pouvez l'appeler Platform.exit(), par exemple dans votre {[5],} appeler.

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

70
répondu Teocali 2016-07-03 15:32:52

Certaines des réponses fournies n'ont pas fonctionné pour moi (javaw.exe toujours en cours d'exécution après la fermeture de la fenêtre) ou, eclipse a montré une exception après la fermeture de l'application.

D'autre part, cela fonctionne parfaitement:

primaryStage.setOnCloseRequest(new EventHandler<WindowEvent>() {
    @Override
    public void handle(WindowEvent t) {
        Platform.exit();
        System.exit(0);
    }
});
35
répondu Cyrus13 2017-07-11 05:27:31

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...
}
21
répondu Pierre Henry 2015-05-08 09:50:01
stage.setOnCloseRequest(new EventHandler<WindowEvent>() {
    @Override
    public void handle(WindowEvent event) {
        Platform.exit();
        System.exit(0);
    }
}
17
répondu Om Prakash 2018-01-16 07:09:39

Avez-vous essayé ceci..setOnCloseRequest

setOnCloseRequest(EventHandler<WindowEvent> value)   

Il est un exemple

3
répondu Sumit Singh 2012-08-28 06:19:00

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
répondu madx 2016-10-11 21:23:55

Cela semblait fonctionner pour moi:

EventHandler<ActionEvent> quitHandler = quitEvent -> {

        System.exit(0);

    };
    // Set the handler on the Start/Resume button
    quit.setOnAction(quitHandler);
0
répondu Eddy Zavala 2017-04-11 15:35:26

Essayez

 System.exit(0);

Cela devrait terminer le thread main et mettre fin au programme principal

0
répondu DENNIS KITHINJI 2017-05-08 11:23:20

Pour moi seulement suivant 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
répondu Piyush Aghera 2018-04-06 06:12:43

GetContentPane.supprimer (jfxPanel);

Essayez-le (:

0
répondu Padronização S A 2018-05-29 16:50:45

Vous devez remplacer la méthode" stop () " dans votre instance D'Application pour que cela fonctionne. Si vous avez remplacé même "stop ()" vide, l'application s'arrête gracieusement après la fermeture de la dernière étape(en fait, la dernière étape doit être l'étape primaire pour que cela fonctionne complètement comme supposé l'être). Aucune plate-forme supplémentaire.les appels exit ou setOnCloseRequest sont nécessaires dans ce cas.

-2
répondu Sap 2017-06-06 14:26:59