JFrame 使应用程序在关闭后仍保持运行

Posted

技术标签:

【中文标题】JFrame 使应用程序在关闭后仍保持运行【英文标题】:JFrame keeps application running even after closing 【发布时间】:2022-01-23 14:54:01 【问题描述】:

我有一个只有静态方法的类,其中一个使用 JFrame 对象作为组件打开一个 JOptionPane 错误消息对话框。

这是类+方法:

public class miscMethods

    static JFrame errorWindow = null;

    public static void ErrorPopup(String message)
    
        errorWindow = new JFrame();
        errorWindow.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        errorWindow.setAlwaysOnTop(true);
        JOptionPane.showMessageDialog(errorWindow, message, "Error", JOptionPane.ERROR_MESSAGE);
        errorWindow = null;
    

ErrorPopup 方法用于 JavaFX 控制器和其他地方,调用方式如下:

import static code.miscMethods.ErrorPopup;
...
ErrorPopup("This is the error message");

问题是当我在弹出窗口出现后从窗口的✕关闭程序时,应用程序的进程不会关闭,因为 JFrame 已创建并显示。 我知道 JFrame 是罪魁祸首,所以我添加了errorWindow.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); 但它似乎什么也没做,因为程序没有关闭。

在这个问题中:JFrame and why stay running 接受的答案是关于非守护线程,但我打开的唯一线程是守护线程,所以除非 JavaFX 打开一个,否则我不会相信。

那么,为什么进程会一直运行,我该如何解决?

我还是 Java 新手,所以如果我犯了错误和/或我的代码显示了不好的做法,请指出来!

编辑:我正在使用 JFrame,因为我需要 setAlwaysOnTop,因为使用 JOptionPane.showMessageDialog(null, message, "Error", JOptionPane.ERROR_MESSAGE); 不在 JavaFX 窗口顶部打开它。如果有更好的方法请告诉我。

【问题讨论】:

您为什么要同时运行 JavaFX 和 Swing? Swing 和 JavaFX 都有自己的线程 “我使用 JFrame 因为...” 但是如果你使用 JavaFX,你根本不应该使用 JOptionPane,你应该使用Alert。我强烈建议您选择一个工具包(Swing 或 JavaFX)并专门使用它。 是的,你们是对的。我不知道为什么我首先切换到 Swing,无论如何我取出 JFrame 的东西并放入 Alert 并且它是 alert.show 并且它正在工作。本来可以避免所有这些 JFrame 的东西,但至少我为未来学到了一些新东西。谢谢大家的建议。 请遵守 java 命名约定 【参考方案1】:

这个:

errorWindow = null;

没有任何用处,因为对象仍然显示。你想要这个:

errorWindow.dispose();

实际上,更好的是,完全摆脱errorWindow 并将null 作为第一个参数传递给JOptionPane。

【讨论】:

哇,这一定是我见过的最快的答案。它似乎也在工作!如果真的解决了问题,我会在 10 分钟限制后接受答案。不过谢谢! @Destard20:听疯狂程序员的声音 只是为了说明这一点。 JOptionPane 不是 JavaFX!那么你为什么首先使用它。 (其他人已经问过同样的问题,但方式不太明确。) 过去我使用 javafx.scene.control.Alert,但后来将其切换为其他方法。我不记得为什么要切换,但可能是因为静态类在访问 javaFX 时遇到了问题,不过这可能是我当时做错了。

以上是关于JFrame 使应用程序在关闭后仍保持运行的主要内容,如果未能解决你的问题,请参考以下文章

即使在卸载后仍保持贝宝应用内购买

RawFraction 性能计数器即使在删除性能类别后仍保持其状态

Qt 应用程序在关闭所有窗口后仍保留在内存中

阻止应用程序关闭

Django中的JSONField即使在POST请求后仍保持为空

JFrame关闭方法的问题