正如标题所说,我的问题是,如何在JavaFX 2.2中阻止/取消关闭主要阶段?我在Google上做了一些研究,以下两个链接似乎解决了这个问题:
我尝试了这两个链接解释的方法,但遗憾的是,对我来说,它们都不起作用。所以,不用多说,这就是我所做的。
首先,我尝试将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的应用程序。
然后我读到了setImplicitExit()
类中名为Platform
的一些神奇方法。考虑到这是我所缺少的,我尝试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();
}
});
从积极的方面开始,应用程序不会像之前那样退出。但是,负面的说法是舞台仍然被关闭/隐藏。
现在,我的军械库中没有武器/装备来解决它,所以我在这里请求你的英雄和冠军的帮助。那么,我怎样才能解决这个问题,或者我做错了什么或者我错过了什么?
答案 0 :(得分:25)
我在我的应用程序中使用了以下代码,它运行正常,
Platform.setImplicitExit(false);
primaryStage.setOnCloseRequest(new EventHandler<WindowEvent>() {
@Override
public void handle(WindowEvent event) {
event.consume();
}
});
答案 1 :(得分:2)
我认为你错了onCloseRequest()
。如果您使用该活动,则取消关闭!因此,如果canExit()
返回false,则使用事件
答案 2 :(得分:2)
我认为这是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);
}
}
答案 3 :(得分:0)
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();
}
}
});