如何在 JavaFX 中获取阶段的关闭事件?

2022-09-02 23:50:41

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

答案 2

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

根据 JavaFX 文档,应用程序实例的生命周期如下:

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

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

因此,您只需覆盖 stop()

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

推荐