防止/取消关闭 JavaFX 2.2 中的主要阶段

2022-09-01 18:55:23

正如标题所说,我的问题是,我如何防止/取消JavaFX 2.2中初级阶段的关闭?我对Google进行了一些研究,以下两个链接似乎解决了这个问题:

我尝试了这两个链接解释的方法,但遗憾的是,对我来说,它们都不起作用。所以,事不宜迟,这就是我所做的。

首先,我试图将一个附加到下面。OnCloseRequestprimaryStage

primaryStage.setOnCloseRequest(new EventHandler<WindowEvent>() {
    @Override
    public void handle(WindowEvent event) {
        if (!canExit()) {
            event.consume();
            primaryStage.show(); // I tried without this line also.
        }
    }
});

当返回时,我试图阻止事件进一步传播,并通过调用导致退出应用程序。但是舞台正在关闭/隐藏,我在Netbeans输出窗口中收到以下错误消息。它不断重复出现,直到我从 Netbeans 强制关闭应用程序。canExit()falseevent.consume()

(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

在这次尝试中尝到了失败的滋味后,我带着对成功的期望换了一个习惯。OnCloseRequestOnHiding

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

    从积极的方面开始,应用程序不会像以前那样退出。但是,负面的一点是,舞台仍然被关闭/隐藏。

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


答案 1

我已经在我的应用程序中使用了以下代码,它工作得很好,

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 错误可能存在也可能不存在,但使用 close 请求事件的任一方式都不会阻止窗口关闭(但进程继续运行)。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);
    }
}

推荐