在JavaFX2.2中防止/取消关闭主阶段
正如标题所说,我的问题是,如何防止/取消JavaFX2.2中初级阶段的关闭?我对谷歌做了一些研究,以下两个链接似乎解决了这个问题:在JavaFX2.2中防止/取消关闭主阶段,java,javafx-2,Java,Javafx 2,正如标题所说,我的问题是,如何防止/取消JavaFX2.2中初级阶段的关闭?我对谷歌做了一些研究,以下两个链接似乎解决了这个问题: 我尝试了这两个链接所解释的方法,但遗憾的是,它们都不起作用。所以,不用再多说了,以下是我所做的 首先,我尝试将OnCloseRequest附加到primaryStage上,如下所示 primaryStage.setOnCloseRequest(new EventHandler<WindowEvent>() { @Override
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.
}
}
});
在尝试失败后,我将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.
}
}
});
没有区别,阶段被关闭/隐藏,相同的错误消息重复出现
on隐藏
version
Platform.setImplicitExit(false);
primaryStage.setOnCloseRequest(new EventHandler<WindowEvent>() {
if (!canExit()) {
// ...
} else {
Platform.exit();
}
});
Platform.setImplicitExit(false);
primaryStage.setOnHiding(new EventHandler<WindowEvent>() {
if (!canExit()) {
// ...
} else {
Platform.exit();
}
});
Platform.setImplicitExit(false);
setOnHiding(新的EventHandler()){
如果(!canExit()){
// ...
}否则{
Platform.exit();
}
});
从正面开始,应用程序不会像以前那样退出。但是,消极的一面是舞台仍在关闭/隐藏现在,我的军械库没有武器/装备来解决这个问题,所以我在这里请求你们英雄和冠军的帮助。那么,我该如何解决这个问题,或者我做错了什么,或者我遗漏了什么?我想你把
onCloseRequest()的概念搞错了。如果您消费了该活动,则取消关闭!如果canExit()
返回false,那么它的工作方式正好相反,如果您使用事件我在我的应用程序中使用了以下代码,它工作得非常好
Platform.setImplicitExit(false);
primaryStage.setOnCloseRequest(new EventHandler<WindowEvent>() {
@Override
public void handle(WindowEvent event) {
event.consume();
}
});
Platform.setImplicitExit(false);
setOnCloseRequest(新的EventHandler()){
@凌驾
公共无效句柄(WindowEvent事件){
event.consume();
}
});
我认为这是JavaFX for Linux的一个错误。我在JavaFX2.2.21-b11上遇到了同样的问题。根据上下文的不同,GTK错误可能存在,也可能不存在,但使用close request事件的任何一种方式都不会阻止窗口关闭(但进程仍在继续运行)。Windows上的同一个应用程序的行为与我预期的一样。因此,充其量,我们在不同平台上的行为存在差异
我提交了一份bug报告,如果你愿意,你可以投票:
这是我的测试应用程序的来源
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);
}
}
导入javafx.application.application;
导入javafx.event.EventHandler;
导入javafx.stage.stage;
导入javafx.stage.WindowEvent;
公共类繁荣扩展了应用程序{
@凌驾
公共作废开始(最终阶段主要){
System.out.println(com.sun.javafx.runtime.VersionInfo.getRuntimeVersion());
primary.setOnCloseRequest(新的EventHandler(){
@凌驾
公共无效句柄(WindowEvent e){
e、 消费();
}
});
primary.show();
}
公共静态void main(字符串[]args){
发射(args);
}
}
这对我很有用
stage.setOnCloseRequest(新的EventHandler(){
@凌驾
公共无效句柄(WindowEvent事件){
AlertHelper addMore=新的AlertHelper(“退出应用程序?任何未保存的数据都将丢失”,“注意”,“需要确认”);
boolean actionNeeded=addMore.populatePopup();
如果(需要采取行动){
系统出口(0);
}否则{
event.consume();
}
}
});
感谢您的提醒,我编辑了我的问题。我的项目中的代码中的条件不同,我使用canExit()
使代码片段更具可读性。但是,它仍然不能回答我所犯的错误。我仍然不明白你为什么叫primaryStage.show!舞台根本就没有关闭,为什么要打电话?一开始,我试着没有那条线,舞台正在关闭/隐藏。然后我想,当事件被触发时,舞台可能会关闭,所以放一个show
就可以了。那也不行。我已经对有问题的那一行进行了评论,因为我也尝试了不使用这一行。
我尝试了同样的操作,窗口被隐藏/关闭,错误((java:3187):Gtk CRITICAL**:IA_Gtk_widget_get_visible:assertion'Gtk_IS_widget(widget)'失败
)持续出现在控制台/终端上,直到我强制退出应用程序。您正在使用哪个操作系统?如果是MAC或ubuntu,这种错误很常见,如果不影响您的应用程序,您可以忽略它。我使用的是Fedora 18,问题是如果应用程序中有一些未保存的更改,如果我忽略此部分,我无法阻止阶段关闭/隐藏。@Jomoos您找到解决方案了吗?同样的问题@Wamasa不,我没有。目前,该应用程序在没有该功能的情况下工作。根据上面的一条评论,它在windows上工作,这可能是Linux和GTK的问题。他们将其标记为重复,并做出以下回应:“这个问题在JDK 8和7u40中已经修复。”
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);
}
}
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();
}
}
});