如何在关闭窗口时关闭JavaFX应用程序?


77

在Swing中,您可以简单地用于setDefaultCloseOperation()在关闭窗口时关闭整个应用程序。

但是,在JavaFX中找不到等效项。我有多个打开的窗口,如果一个窗口关闭,我想关闭整个应用程序。用JavaFX做到这一点的方法是什么?

编辑:

我了解可以覆盖setOnCloseRequest()以在窗口关闭时执行一些操作。问题是应该执行什么操作才能终止整个应用程序?

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

类中stop()定义的方法Application不执行任何操作。

Answers:


87

当最后一个Stage关闭时,应用程序自动停止。目前,stop()您的Application类的方法已被调用,因此您不需要等价于setDefaultCloseOperation()

如果要在此之前停止应用程序,则可以调用Platform.exit(),例如在onCloseRequest通话中。

您可以在以下网址的javadoc页面上获得所有这些信息Applicationhttp : //docs.oracle.com/javafx/2/api/javafx/application/Application.html


5
供参考(如链接的Javadoc页面中所述):仅当implicitExiton属性Platform设置为时,应用程序才会自动停止true
RahelLüthy2015年

58

提供的某些答案对我不起作用(关闭窗口后javaw.exe仍在运行),或者eclipse在关闭应用程序后显示异常。

另一方面,这很完美:

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

您是否正在执行多线程操作?在我看来,使用ExecutorService时(对于我而言)没有关闭(这可能是预期的行为,我尚未检查文档)。
Manius

1
对我来说,添加System.exit(0);唯一使进程在主窗口关闭后终止的原因。
约翰内斯

1
如果您喜欢它,可以在Java 8中使用:theStage.setOnCloseRequest(e-> System.exit(0));
哈科·范·尼克尔

1
如果ExecutorService像@Manius一样启动自己的线程池(即线程池),则需要显式关闭它(如果线程是非守护程序)。如果需要,可以在#stop()应用程序类的方法中执行此操作。但是,JavaFX本身并不管理ExecutorService实例(或任何其他创建线程的并发实用程序)。
Slaw

26

作为参考,这是使用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...
}

20
stage.setOnCloseRequest(new EventHandler<WindowEvent>() {
    @Override
    public void handle(WindowEvent event) {
        Platform.exit();
        System.exit(0);
    }
});

我只想指出,在这种情况下,根本不会调用stop()方法(至少在Windows上使用JavaFX 8),因为System.exit()关闭所有内容的时间过早。在这种情况下,您可能只调用System.exit()。但是,如果您想在stop()方法中执行某些操作,建议您在此处调用Platform.exit(),并在需要时在stop()方法的末尾调用System.exit(0)。
明天

这里有些语法不好。您错过了结账')'
Nibb,


3

使用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);
    });
}

2

与其使用onCloseRequest处理程序或窗口事件,不如调用Platform.setImplicitExit(true)应用程序的开头。

根据JavaDocs:

“如果此属性为true,则在关闭最后一个窗口时,JavaFX运行时将隐式关闭; JavaFX启动器将调用Application.stop()方法并终止JavaFX应用程序线程。”

例:

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

1
不错,但是至少在FX 12中默认启用了它。 The default value is true.
本杰明·彼得,

1

对我来说,只有以下工作:

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

这似乎对我有用:

EventHandler<ActionEvent> quitHandler = quitEvent -> {

        System.exit(0);

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



-2

您必须在您的Application实例中覆盖“ stop()”方法以使其起作用。如果您覆盖了甚至是空的“ stop()”,那么在最后一个阶段关闭之后,应用程序也会正常关闭(实际上,最后一个阶段必须是主要阶段,以使其能够按预期方式完全工作)。在这种情况下,不需要任何其他Platform.exit或setOnCloseRequest调用。


请提供一个工作的例子-并没有为我工作
沃尔夫冈·法尔
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.