【发布时间】: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); 两种方法,如下所示:
-
OnCloseRequest版本Platform.setImplicitExit(false); primaryStage.setOnCloseRequest(new EventHandler<WindowEvent>() { if (!canExit()) { // ... } else { Platform.exit(); } });没有区别,舞台被关闭/隐藏,并且重复出现相同的错误消息。
-
OnHiding版本Platform.setImplicitExit(false); primaryStage.setOnHiding(new EventHandler<WindowEvent>() { if (!canExit()) { // ... } else { Platform.exit(); } });从积极的方面开始,应用程序不会像之前那样退出。但是,不利的一点是,舞台仍在关闭/隐藏。
现在,我的军械库中没有武器/装备来解决它,所以我在这里请求各位英雄和勇士的帮助。那么,我该如何解决这个问题或者我做错了什么或者我错过了什么?
【问题讨论】: