如何在 JavaFX 中获得一个阶段的关闭事件?

Posted

技术标签:

【中文标题】如何在 JavaFX 中获得一个阶段的关闭事件?【英文标题】:How do I get the close event of a stage in JavaFX? 【发布时间】:2014-04-29 20:28:59 【问题描述】:

在 JavaFX 中,如果用户单击舞台上的关闭按钮 (X)(最右边的顶部十字),我如何获取事件?

我希望我的应用程序在窗口关闭时打印一条调试消息。 (System.out.println("Application Close by click to Close Button(X)"))

@Override
   public void start(Stage primaryStage) 
        StackPane root = new StackPane();
       root.getChildren().add(btn);
       Scene scene = new Scene(root, 300, 250);
       primaryStage.setTitle("Hello World!");
       primaryStage.setScene(scene);
       primaryStage.show();

       // Any Event Handler
       //
       System.out.println("Application(primaryStage) Closed by click to Close Button(X)");
       //
   

【问题讨论】:

【参考方案1】:

我得到了这个问题的答案

stage.setOnHiding(new EventHandler<WindowEvent>() 

         @Override
         public void handle(WindowEvent event) 
             Platform.runLater(new Runnable() 

                 @Override
                 public void run() 
                     System.out.println("Application Closed by click to Close Button(X)");
                     System.exit(0);
                 
             );
         
     );

【讨论】:

它是stage.setOnCloseRequest(...) .setOnHiding 为我工作,而 .setOnCloseRequest 没有 没有System.exit调用有没有办法关闭窗口? setOnCloseRequest 只会在有关闭窗口的外部请求时被调用,我认为这意味着手动单击关闭按钮。这也意味着它不会被stage.close() 调用触发。【参考方案2】:

实现相同效果但与您启动应用程序的方式更一致的另一种方法是覆盖 stop();

根据JavaFX文档,Application实例的生命周期如下:

每当启动应用程序时,JavaFX 运行时都会按顺序执行以下操作:

    构造指定应用程序类的实例 调用 init() 方法 调用 start(javafx.stage.Stage) 方法 等待应用程序完成,当发生以下任一情况时会发生这种情况: 应用程序调用 Platform.exit() 最后一个窗口已经关闭,Platform 的implicitExit 属性为真 调用 stop() 方法

因此,您只需覆盖 stop()

@Override
public void stop()
    System.out.println("Stage is closing");

【讨论】:

【参考方案3】:
stage.setOnCloseRequest(new EventHandler<WindowEvent>() 
      public void handle(WindowEvent we) 
          System.out.println("Stage is closing");
      
  ); 

【讨论】:

以上是关于如何在 JavaFX 中获得一个阶段的关闭事件?的主要内容,如果未能解决你的问题,请参考以下文章

关闭阶段JavaFX后如何停止WebEngine?

在JavaFX中为TextField设置KeyPressed事件

窗口/舞台失去焦点时的事件

如何向JavaFX选项卡添加多个选项卡关闭事件处理程序?

JavaFX 2.0:关闭阶段(窗口)

JavaFX如何改变阶段