【问题标题】:How do I get the close event of a stage in JavaFX?如何在 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)");
       //}
   }

【问题讨论】:

    标签: java javafx javafx-2 stage


    【解决方案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 运行时都会按顺序执行以下操作:

    1. 构造指定应用程序类的实例
    2. 调用 init() 方法
    3. 调用 start(javafx.stage.Stage) 方法
    4. 等待应用程序完成,当发生以下任一情况时会发生这种情况:
      • 应用程序调用 Platform.exit()
      • 最后一个窗口已经关闭,Platform 的implicitExit 属性为真
    5. 调用 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");
            }
        }); 
      

      【讨论】:

        猜你喜欢
        • 2015-02-04
        • 1970-01-01
        • 2017-11-27
        • 1970-01-01
        • 2014-04-21
        • 2014-04-07
        • 2012-04-30
        • 2014-07-10
        相关资源
        最近更新 更多