【发布时间】:2015-02-24 14:43:27
【问题描述】:
我正在尝试关闭我的主应用程序用户界面,但让代码在启动应用程序的 main() 函数中运行。现在我遇到的问题是在 Mac 上,即使没有显示任何窗口,程序名称仍保留在 Mac 的菜单栏中。
所以基本上在退出应用程序的代码中:
private void exitMenuItemActionPerformed(java.awt.event.ActionEvent evt) {
//System.exit(0);
this.setVisible( false );
// Do something here to finish closing application.
}
启动应用程序的主函数如下所示:
public static void main(String args[]) {
java.awt.EventQueue.invokeLater(new Runnable() {
public void run() {
// NewApplication is a javax.swing.JFrame
new NewApplication().setVisible(true);
}
});
while (true) {
// Watch for user to relaunch UI and do lots of other tasks.
}
}
如果我使用 System.exit(0) 它将完全停止整个 JVM 并停止在 while 循环中运行这些东西。我不知道如何退出主应用程序 UI,停止在菜单栏中显示,但仍然运行 while 循环的东西。
我尝试这样做的原因是我需要一些可以连续运行的东西,有时用户需要运行一个与正在运行的东西交互的用户界面。 while 循环中的内容检查它们是否正在尝试再次启动用户界面(以及其他功能)并重新加载它。一种选择是让一个程序连续运行并使用进程间通信在用户界面和非 UI 程序之间进行通信,但我需要来回传递大量数据,所以我不喜欢这个选项。
【问题讨论】:
-
stackoverflow.com/a/1235994/1291150 这是您要找的吗?
-
setDefaultCloseOperation(JFrame.DoNothing) 我不记得 const 名称 :)
-
有一个名为 Apple Java Extensions 的 API,可让您控制 Java 程序如何与 OSX 窗口管理器交互。它仍然存在,但 Apple 已弃用它,并帮助清除了其开发者网站上的所有文档痕迹。了解它的最佳方式可能是研究像 Orange Extensions 这样的开源存根库。
-
谢谢,但是
this.dispatchEvent(new WindowEvent(this, WindowEvent.WINDOW_CLOSING));完全关闭了程序(包括while 循环),我还应该提到this.dispose()让应用程序在Mac 菜单栏中保持打开状态。frame.setDefaultCloseOperation( JFrame.DO_NOTHING_ON_CLOSE );还会在 Mac 菜单栏中保留应用程序的名称(选择退出菜单后)。 -
如果您打算让应用程序继续运行,为什么您希望应用程序不会出现在菜单栏上?
标签: java macos swing user-interface