【问题标题】:How to close a JavaFX application on window close?如何在窗口关闭时关闭 JavaFX 应用程序?
【发布时间】:2012-08-22 15:04:40
【问题描述】:

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

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

编辑:

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

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

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

【问题讨论】:

    标签: java javafx javafx-2 javafx-8


    【解决方案1】:

    你试过了吗..setOnCloseRequest

    setOnCloseRequest(EventHandler<WindowEvent> value)   
    

    有一个example

    【讨论】:

    • 比stop()方法好?
    【解决方案2】:

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

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

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

    【讨论】:

    • 供参考(如链接的 javadoc 页面中所述):仅当 Platform 上的 implicitExit 属性设置为 true 时,应用程序才会自动停止。
    【解决方案3】:

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

    【讨论】:

      【解决方案4】:
      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)。
      • 这里有一些不好的语法。你错过了一个结束 ')'
      【解决方案5】:

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

      另一方面,这非常有效:

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

      【讨论】:

      • 你在做多线程的事情吗?在我看来,使用 ExecutorService 时它没有关闭(对我来说)(这可能是预期的行为,我还没有检查文档)。
      • 对我来说,添加 System.exit(0); 是唯一让进程在主窗口关闭后终止的事情。
      • 如果你喜欢它简短,这适用于 Java 8:theStage.setOnCloseRequest(e -> System.exit(0));
      • 如果您像@Manius 那样启动自己的ExecutorService(即线程池),那么您需要显式关闭它(如果线程是非守护进程)。如果需要,您可以在应用程序类的 #stop() 方法中执行此操作。但是,JavaFX 本身并不管理 ExecutorService 实例(或任何其他创建线程的并发实用程序)。
      【解决方案6】:

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

      【讨论】:

        【解决方案7】:

        这似乎对我有用:

        EventHandler<ActionEvent> quitHandler = quitEvent -> {
        
                System.exit(0);
        
            };
            // Set the handler on the Start/Resume button
            quit.setOnAction(quitHandler);
        

        【讨论】:

          【解决方案8】:

          试试

           System.exit(0);
          

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

          【讨论】:

            【解决方案9】:

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

            【讨论】:

            • 请提供一个工作示例 - 不适合我
            【解决方案10】:

            对我来说只有以下工作:

            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();
                }
            });
            

            【讨论】:

              【解决方案11】:

              getContentPane.remove(jfxPanel);

              试试看(:

              【讨论】:

                【解决方案12】:

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

                根据 JavaDocs:

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

                例子:

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

                【讨论】:

                • 很好,但至少在FX 12 中默认启用。 The default value is true.
                【解决方案13】:

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


                示例:

                舞台阶段 =new Stage();

                BorderPane root=new BorderPane();

                场景场景=new Scene();

                Button b= new Button("name button");

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

                root.getChildren().add(b);

                stage.setTitle("");

                stage.setScene(场景);

                stage.show();

                【讨论】:

                • 请尝试清理代码,以便读者可以关注它。一些代码被格式化为代码,但其余的不是;请将所有代码格式化为代码,如果部分之间有中断,请明确说明。
                猜你喜欢
                • 1970-01-01
                • 1970-01-01
                • 2020-05-02
                • 1970-01-01
                • 2011-06-21
                • 2011-04-19
                • 2012-04-17
                • 1970-01-01
                • 1970-01-01
                相关资源
                最近更新 更多