84

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

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

编辑:

我知道我可以重写setOnCloseRequest()以在关闭窗口时执行一些操作。问题是应该执行什么操作来终止整个应用程序?

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

stop()类中定义的方法Application什么都不做。

4

13 回答 13

97

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

如果您想在此之前停止应用程序,您可以调用Platform.exit(),例如在您的onCloseRequest调用中。

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

于 2012-08-28T06:50:31.823 回答
77

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

另一方面,这完美地工作:

primaryStage.setOnCloseRequest(new EventHandler<WindowEvent>() {
    @Override
    public void handle(WindowEvent t) {
        Platform.exit();
        System.exit(0);
    }
});
于 2015-07-20T14:25:17.930 回答
28

作为参考,这里是使用 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...
}
于 2015-05-08T09:50:01.177 回答
24
stage.setOnCloseRequest(new EventHandler<WindowEvent>() {
    @Override
    public void handle(WindowEvent event) {
        Platform.exit();
        System.exit(0);
    }
});
于 2015-06-09T05:49:55.890 回答
3

你试过这个.. setOnCloseRequest

setOnCloseRequest(EventHandler<WindowEvent> value)   

有一个例子

于 2012-08-28T06:19:00.807 回答
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);
    });
}
于 2016-10-11T21:23:55.100 回答
3

与其玩弄 onCloseRequest 处理程序或窗口事件,我更喜欢调用Platform.setImplicitExit(true)应用程序的开头。

根据JavaDocs:

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

例子:

@Override
void start(Stage primaryStage) {
    Platform.setImplicitExit(true)
    ...
    // create stage and scene
}
于 2019-05-31T03:57:42.233 回答
2

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

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();
    }
});
于 2018-04-06T06:12:43.080 回答
0

这似乎对我有用:

EventHandler<ActionEvent> quitHandler = quitEvent -> {

        System.exit(0);

    };
    // Set the handler on the Start/Resume button
    quit.setOnAction(quitHandler);
于 2017-04-11T15:35:26.500 回答
0

尝试

 System.exit(0);

这应该终止线程主程序并结束主程序

于 2017-05-08T11:23:20.747 回答
0

getContentPane.remove(jfxPanel);

尝试一下 (:

于 2018-05-29T16:50:45.840 回答
-1

在行动按钮试试这个:stage.close();


例子:

阶段阶段=新阶段();

BorderPane root=new BorderPane();

场景场景=新场景();

按钮 b= new Button("名称按钮");

       b.setOnAction(new EventHandler<ActionEvent>() {
   
       @Override
        public void handle(ActionEvent event) {

                 stage.close();
               
            }
            });

root.getChildren().add(b);

stage.setTitle("");

stage.setScene(场景);

舞台.show();

于 2021-05-08T11:36:43.780 回答
-2

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

于 2017-06-06T14:26:59.233 回答