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.
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
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);
}
});
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...
}
stage.setOnCloseRequest(new EventHandler<WindowEvent>() {
@Override
public void handle(WindowEvent event) {
Platform.exit();
System.exit(0);
}
}
Avez-vous essayé ceci .. setOnCloseRequest
setOnCloseRequest(EventHandler<WindowEvent> value)
Il y a un exemple
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);
});
}
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
}
Cela a semblé fonctionner pour moi:
EventHandler<ActionEvent> quitHandler = quitEvent -> {
System.exit(0);
};
// Set the handler on the Start/Resume button
quit.setOnAction(quitHandler);
getContentPane.remove (jfxPanel);
essayez-le (:
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();
}
});
Essayer
System.exit(0);
cela devrait mettre fin au fil principal et au programme principal