Swingでは、setDefaultCloseOperation()
を使用して、ウィンドウが閉じられたときにアプリケーション全体をシャットダウンできます。
ただし、JavaFXでは同等のものを見つけることができません。複数のウィンドウを開いていますが、ウィンドウが閉じている場合はアプリケーション全体を閉じたいです。 JavaFXでそれを行う方法は何ですか?
編集:
setOnCloseRequest()
をオーバーライドして、ウィンドウを閉じるときに何らかの操作を実行できることを理解しています。問題は、アプリケーション全体を終了するためにどの操作を実行する必要があるかということです。
stage.setOnCloseRequest(new EventHandler<WindowEvent>() {
@Override
public void handle(WindowEvent event) {
stop();
}
});
Application
クラスで定義されたstop()
メソッドは何もしません。
最後のStage
が閉じられると、アプリケーションは自動的に停止します。この時点で、Application
クラスのstop()
メソッドが呼び出されるため、setDefaultCloseOperation()
に相当するものは必要ありません
その前にアプリケーションを停止する場合は、onCloseRequest
呼び出しなどでPlatform.exit()
を呼び出すことができます。
これらの情報はすべて、Application
のjavadocページで入手できます。 http://docs.Oracle.com/javafx/2/api/javafx/application/Application.html
提供された回答の一部が機能しなかった(ウィンドウを閉じた後もjavaw.exeが実行されている)か、アプリケーションを閉じた後にEclipseが例外を示しました。
一方、これは完全に機能します:
primaryStage.setOnCloseRequest(new EventHandler<WindowEvent>() {
@Override
public void handle(WindowEvent t) {
Platform.exit();
System.exit(0);
}
});
参考のために、以下は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);
}
}
Java 8を使用すると、これでうまくいきました。
@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);
});
}
OnCloseRequestハンドラーまたはウィンドウイベントをいじる代わりに、Platform.setImplicitExit(true)
をアプリケーションの先頭から呼び出すことを好みます。
JavaDocsによると:
「この属性がtrueの場合、最後のウィンドウが閉じられたときにJavaFXランタイムが暗黙的にシャットダウンします。JavaFXランチャーはApplication.stop()メソッドを呼び出し、JavaFXアプリケーションスレッドを終了します。」
例:
@Override
void start(Stage primaryStage) {
Platform.setImplicitExit(true)
...
// create stage and scene
}
これは私にとってはうまくいったようです:
EventHandler<ActionEvent> quitHandler = quitEvent -> {
System.exit(0);
};
// Set the handler on the Start/Resume button
quit.setOnAction(quitHandler);
getContentPane.remove(jfxPanel);
それを試してみてください (:
私にとっては、以下だけが機能しています:
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();
}
});
試してみる
System.exit(0);
これにより、スレッドmainが終了し、メインプログラムが終了します。