在JavaFX 2.2中防止/取消关闭主要阶段
正如标题所说,我的问题是,如何防止/取消JavaFX 2.2中初级阶段的关闭? 我已经对Google做了一些研究,以下两个链接似乎解决了这个问题:
- 阻止或取消退出JavaFX 2
- 线程:JavaFX 2.0 Stage onClose事件
我尝试了这两个链接解释的方法,但遗憾的是,对我来说,它们都不起作用。 所以,不用多说,这就是我所做的。
首先,我尝试将OnCloseRequest
附加到primaryStage
,如下所示。
primaryStage.setOnCloseRequest(new EventHandler() { @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() { @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() { if (!canExit()) { // ... } else { Platform.exit(); } });
没有区别,舞台被关闭/隐藏,并且重复出现相同的错误消息。
-
OnHiding
版本Platform.setImplicitExit(false); primaryStage.setOnHiding(new EventHandler() { if (!canExit()) { // ... } else { Platform.exit(); } });
从积极的方面开始,应用程序不会像之前那样退出。 但是,负面的注意事项是舞台仍在关闭/隐藏。
现在,我的军械库中没有武器/装备来解决它,所以我在这里请求你的英雄和冠军的帮助。 那么,我该如何解决这个问题,或者我做错了什么或者我错过了什么?
我在我的应用程序中使用了以下代码,它运行正常,
Platform.setImplicitExit(false); primaryStage.setOnCloseRequest(new EventHandler() { @Override public void handle(WindowEvent event) { event.consume(); } });
我认为这是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() { @Override public void handle(WindowEvent e) { e.consume(); } }); primary.show(); } public static void main(String[] args) { launch(args); } }
我认为你的onCloseRequest()
错了。 如果您使用该活动,则取消关闭! 所以它的另一个原因是round,如果canExit()
返回false,你会消耗该事件