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 性能计数器即使在删除性能类别后仍保持其状态