如何在JavaFX中获取舞台关闭事件?

17
在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)");
       //}
   }
3个回答

18

我已经得到了这个问题的答案

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

14
它是 stage.setOnCloseRequest(...) - Oliver Jan Krylow
5
.setOnHiding 对我有效,而 .setOnCloseRequest 则无效。 - Sam Orozco
1
有没有办法在不调用 System.exit 的情况下关闭窗口? - turbanoff
1
只有在外部请求关闭窗口时,setOnCloseRequest 才会被调用,我猜这意味着手动点击关闭按钮。这也意味着它不会被 stage.close() 调用触发。 - Hendra Anggrian

13

还有一种实现相同效果的方法,但更符合启动应用程序的方式,那就是重写stop()方法。

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

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

  1. 构造指定的Application类的实例
  2. 调用init()方法
  3. 调用start(javafx.stage.Stage)方法
  4. 等待应用程序完成,当发生以下任意一种情况时结束:
    • 应用程序调用Platform.exit()
    • 最后一个窗口已关闭并且Platform上的implicitExit属性为true
  5. 调用stop()方法

因此,你只需要重写stop()方法即可。

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

8
stage.setOnCloseRequest(new EventHandler<WindowEvent>() {
      public void handle(WindowEvent we) {
          System.out.println("Stage is closing");
      }
  }); 

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接