web-dev-qa-db-ja.com

ウィンドウを閉じるときにJavaFXアプリケーションを閉じる方法

Swingでは、setDefaultCloseOperation()を使用して、ウィンドウが閉じられたときにアプリケーション全体をシャットダウンできます。

ただし、JavaFXでは同等のものを見つけることができません。複数のウィンドウを開いていますが、ウィンドウが閉じている場合はアプリケーション全体を閉じたいです。 JavaFXでそれを行う方法は何ですか?

編集:

setOnCloseRequest()をオーバーライドして、ウィンドウを閉じるときに何らかの操作を実行できることを理解しています。問題は、アプリケーション全体を終了するためにどの操作を実行する必要があるかということです。

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

Applicationクラスで定義されたstop()メソッドは何もしません。

69
Kshitiz Sharma

最後のStageが閉じられると、アプリケーションは自動的に停止します。この時点で、Applicationクラスのstop()メソッドが呼び出されるため、setDefaultCloseOperation()に相当するものは必要ありません

その前にアプリケーションを停止する場合は、onCloseRequest呼び出しなどでPlatform.exit()を呼び出すことができます。

これらの情報はすべて、Applicationのjavadocページで入手できます。 http://docs.Oracle.com/javafx/2/api/javafx/application/Application.html

76
Teocali

提供された回答の一部が機能しなかった(ウィンドウを閉じた後もjavaw.exeが実行されている)か、アプリケーションを閉じた後にEclipseが例外を示しました。

一方、これは完全に機能します:

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

参考のために、以下は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...
}
25
Pierre Henry
stage.setOnCloseRequest(new EventHandler<WindowEvent>() {
    @Override
    public void handle(WindowEvent event) {
        Platform.exit();
        System.exit(0);
    }
}
19
Om Prakash

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

これを試しましたか?. setOnCloseRequest

setOnCloseRequest(EventHandler<WindowEvent> value)   

1つあります

3
Sumit Singh

OnCloseRequestハンドラーまたはウィンドウイベントをいじる代わりに、Platform.setImplicitExit(true)をアプリケーションの先頭から呼び出すことを好みます。

JavaDocsによると:

「この属性がtrueの場合、最後のウィンドウが閉じられたときにJavaFXランタイムが暗黙的にシャットダウンします。JavaFXランチャーはApplication.stop()メソッドを呼び出し、JavaFXアプリケーションスレッドを終了します。」

例:

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

これは私にとってはうまくいったようです:

EventHandler<ActionEvent> quitHandler = quitEvent -> {

        System.exit(0);

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

getContentPane.remove(jfxPanel);

それを試してみてください (:

0

私にとっては、以下だけが機能しています:

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

試してみる

 System.exit(0);

これにより、スレッドmainが終了し、メインプログラムが終了します。

0
DENNIS KITHINJI