【问题标题】:Prevent/Cancel closing of primary stage in JavaFX 2.2在 JavaFX 2.2 中阻止/取消关闭初级阶段
【发布时间】:2013-06-04 22:18:48
【问题描述】:

正如标题所说,我的问题是,如何防止/取消 JavaFX 2.2 中初级阶段的关闭?我对谷歌做了一些研究,以下两个链接似乎解决了这个问题:

我尝试了这两个链接解释的方法,但遗憾的是,它们都不起作用。所以,事不宜迟,这就是我所做的。

首先,我尝试将OnCloseRequest 附加到primaryStage,如下所示。

primaryStage.setOnCloseRequest(new EventHandler<WindowEvent>() {
    @Override
    public void handle(WindowEvent event) {
        if (!canExit()) {
            event.consume();
            primaryStage.show(); // I tried without this line also.
        }
    }
});

canExit() 返回false 时,我试图阻止事件进一步传播并通过调用event.consume() 导致退出应用程序。但是舞台正在关闭/隐藏,我在 Netbeans 输出窗口中收到以下错误消息。它不断重复,直到我从 Netbeans 强制关闭应用程序。

(java:6731): Gtk-CRITICAL **: IA__gtk_widget_get_visible: assertion `GTK_IS_WIDGET (widget)' failed

(java:6731): Gtk-CRITICAL **: IA__gtk_widget_get_visible: assertion `GTK_IS_WIDGET (widget)' failed

(java:6731): Gtk-CRITICAL **: IA__gtk_widget_get_visible: assertion `GTK_IS_WIDGET (widget)' failed

在这次尝试中尝到了失败的滋味,我把OnCloseRequest改成了OnHiding,期待成功。

primaryStage.setOnHiding(new EventHandler<WindowEvent>() {
    @Override
    public void handle(WindowEvent event) {
        if (!canExit()) {
            event.consume();
            primaryStage.show(); // I tried without this line also.
        }
    }
});

虽然我在这次尝试中也尝到了失败的滋味,但我想我已经取得了一些进展。这次没有错误信息,不需要从 Netbeans 强制关闭应用程序。

然后我在Platform 类中读到了一些名为setImplicitExit() 的魔术方法。认为这是我所缺少的,我尝试了Platform.setImplicitExit(false); 两种方法,如下所示:

  1. OnCloseRequest版本

    Platform.setImplicitExit(false);
    
    primaryStage.setOnCloseRequest(new EventHandler<WindowEvent>() {
        if (!canExit()) {
            // ...
        } else {
            Platform.exit();
        }
    });
    

    没有区别,舞台被关闭/隐藏,并且重复出现相同的错误消息。

  2. OnHiding版本

    Platform.setImplicitExit(false);
    
    primaryStage.setOnHiding(new EventHandler<WindowEvent>() {
        if (!canExit()) {
            // ...
        } else {
            Platform.exit();
        }
    });
    

    从积极的方面开始,应用程序不会像之前那样退出。但是,不利的一点是,舞台仍在关闭/隐藏。

现在,我的军械库中没有武器/装备来解决它,所以我在这里请求各位英雄和勇士的帮助。那么,我该如何解决这个问题或者我做错了什么或者我错过了什么?

【问题讨论】:

    标签: java javafx-2


    【解决方案1】:

    我认为你把 onCloseRequest() 的概念弄错了。如果您消费该事件,您将取消关闭!所以它反过来工作,如果canExit() 返回 false 你消费这个事件

    【讨论】:

    • 感谢您的注意,我编辑了我的问题。我的项目代码中的条件不同,我使用canExit() 使代码sn-p 更具可读性。但是,它仍然无法解决我遇到的错误。
    • 我还是不明白你为什么叫primaryStage.show!舞台根本没有关闭,为什么要叫表演?
    • 最初,我尝试不使用该行,但舞台正在关闭/隐藏。然后我想可能是在触发事件时舞台关闭了,所以放一个show 就可以了。那也行不通。我已经以I tried without this line also. 评论了该行
    【解决方案2】:

    这对我有用

                    stage.setOnCloseRequest(new EventHandler<WindowEvent>() {  
                        @Override
                        public void handle(WindowEvent event) {
                            AlertHelper addMore = new AlertHelper("Exit application? Any unsaved data will be lost", "Attention", "Confirmation Required");
                            boolean actionNeeded = addMore.populatePopup();
                            if (actionNeeded) {
                                System.exit(0);
                            } else {
                                event.consume();
                            }
    
                        }
                    });
    

    【讨论】:

      【解决方案3】:

      我在我的应用程序中使用了以下代码,它运行良好,

      Platform.setImplicitExit(false);
      
      primaryStage.setOnCloseRequest(new EventHandler<WindowEvent>() {
          @Override
          public void handle(WindowEvent event) {
              event.consume();
          }
      });
      

      【讨论】:

      • 我尝试了同样的方法,窗口被隐藏/关闭,并且错误((java:3187): Gtk-CRITICAL **: IA__gtk_widget_get_visible: assertion 'GTK_IS_WIDGET (widget)' failed)不断出现在控制台/终端上,直到我强制退出应用程序。
      • 您使用的是哪个操作系统?如果是 MAC 或者 ubuntu 这样的错误很常见,如果不影响你的应用,你可以直接忽略它。
      • 我使用的是 Fedora 18,问题是如果我忽略此部分,如果应用程序中有一些未保存的更改,我无法阻止舞台关闭/隐藏。
      • @Jomoos 你找到解决方案了吗?同样的问题!
      • @Wamasa 不,我没有。目前,该应用程序在没有该功能的情况下工作。根据上面的评论之一,它可以在 Windows 上运行,这可能是 Linux 和 GTK 的问题。
      【解决方案4】:

      我认为这是 JavaFX for Linux 的一个错误。我在 Javafx 2.2.21-b11 上遇到了同样的问题。根据上下文,GTK 错误可能存在也可能不存在,但是使用关闭请求事件的任何一种方式都不会阻止窗口关闭(但进程会继续运行)。 Windows 上的同一个应用程序的行为与我预期的一样。所以充其量我们在跨平台的行为上存在差异。

      我提交了一份错误报告,如果您愿意,可以投票:https://javafx-jira.kenai.com/browse/RT-33295

      这是我的测试应用的源代码

      import javafx.application.Application;
      import javafx.event.EventHandler;
      import javafx.stage.Stage;
      import javafx.stage.WindowEvent;
      
      public class Boom extends Application {
          @Override
          public void start(final Stage primary)  {
              System.out.println(com.sun.javafx.runtime.VersionInfo.getRuntimeVersion());
              primary.setOnCloseRequest(new EventHandler<WindowEvent>() {
                  @Override
                  public void handle(WindowEvent e) {
                      e.consume();
                  }
              });
              primary.show();
          }
      
          public static void main(String[] args) {
              launch(args);
          }
      }
      

      【讨论】:

      • 他们通过将其标记为重复并做出以下回应:“此问题已在 JDK 8 和 7u40 中修复。”
      猜你喜欢
      • 2012-08-25
      • 1970-01-01
      • 2014-04-21
      • 1970-01-01
      • 1970-01-01
      • 2012-04-30
      • 2016-12-06
      • 2014-12-24
      相关资源
      最近更新 更多