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

时间:2012-08-28 06:10:00

标签: java javafx javafx-2 javafx-8

在Swing中,您只需使用setDefaultCloseOperation()即可在窗口关闭时关闭整个应用程序。

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

编辑:

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

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

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

13 个答案:

答案 0 :(得分:73)

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

如果您想在此之前停止申请,可以拨打Platform.exit(),例如在onCloseRequest来电中。

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

答案 1 :(得分:44)

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

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

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

答案 2 :(得分:25)

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

答案 3 :(得分:18)

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

答案 4 :(得分:3)

你试过这个.. setOnCloseRequest

setOnCloseRequest(EventHandler<WindowEvent> value)   

有一个example

答案 5 :(得分:2)

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

答案 6 :(得分:0)

这似乎对我有用:

EventHandler<ActionEvent> quitHandler = quitEvent -> {

        System.exit(0);

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

答案 7 :(得分:0)

尝试

 System.exit(0);

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

答案 8 :(得分:0)

对我来说只有以下工作:

getCount

答案 9 :(得分:0)

getContentPane.remove(jfxPanel);

尝试一下(:

答案 10 :(得分:0)

我宁愿不使用onCloseRequest处理程序或窗口事件,而更喜欢在应用程序的开头调用[]

根据JavaDocs:

  

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

示例:

Platform.setImplicitExit(true)

答案 11 :(得分:-1)

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


例如:

舞台 stage =new Stage();

BorderPane root=new BorderPane();

场景场景=新场景();

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

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

                 stage.close();
               
            }
            });

root.getChildren().add(b);

stage.setTitle("");

stage.setScene(scene);

stage.show();

答案 12 :(得分:-3)

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