在JavaFX2.2中防止/取消关闭主阶段

在JavaFX2.2中防止/取消关闭主阶段,java,javafx-2,Java,Javafx 2,正如标题所说,我的问题是,如何防止/取消JavaFX2.2中初级阶段的关闭?我对谷歌做了一些研究,以下两个链接似乎解决了这个问题: 我尝试了这两个链接所解释的方法,但遗憾的是,它们都不起作用。所以,不用再多说了,以下是我所做的 首先,我尝试将OnCloseRequest附加到primaryStage上,如下所示 primaryStage.setOnCloseRequest(new EventHandler<WindowEvent>() { @Override

正如标题所说,我的问题是,如何防止/取消JavaFX2.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.
        }
    }
});
在尝试失败后,我将
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();
                            }
    
                        }
                    });