在JavaFX 2.2中阻止/取消关闭主要阶段

问题描述 投票:22回答:4

正如标题所说,我的问题是,如何防止/取消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);

  1. OnCloseRequest版本 Platform.setImplicitExit(false); primaryStage.setOnCloseRequest(new EventHandler<WindowEvent>() { if (!canExit()) { // ... } else { Platform.exit(); } }); 没有区别,舞台被关闭/隐藏,并且重复出现相同的错误消息。
  2. OnHiding版本 Platform.setImplicitExit(false); primaryStage.setOnHiding(new EventHandler<WindowEvent>() { if (!canExit()) { // ... } else { Platform.exit(); } }); 从积极的方面开始,应用程序不会像以前那样退出。但是,负面的注意事项是舞台仍在关闭/隐藏。

现在,我的军械库中没有武器/装备来解决它,所以我在这里请求你的英雄和冠军的帮助。那么,我该如何解决这个问题,或者我做错了什么或者我错过了什么?

java javafx-2
4个回答
25
投票

我在我的应用程序中使用了以下代码,它运行正常,

Platform.setImplicitExit(false);

primaryStage.setOnCloseRequest(new EventHandler<WindowEvent>() {
    @Override
    public void handle(WindowEvent event) {
        event.consume();
    }
});

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);
    }
}

2
投票

我认为你错了onCloseRequest()。如果您使用该活动,则取消关闭!所以它的另一个原因是圆形,如果canExit()返回false,你就会消耗该事件


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();
                        }

                    }
                });
© www.soinside.com 2019 - 2024. All rights reserved.