我正在尝试关闭主应用程序用户界面,但让代码在启动应用程序的 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 程序之间进行通信,但我需要来回传递大量数据,所以我不喜欢这个选项。
最佳答案
看来没有一个简单的方法可以做到这一点。对于那些遇到同样问题的人,这里有一些选择:
1) 看起来就像我使用 Mac 任务栏(位于屏幕右上角)的其他程序一样。访问该程序的唯一方法是通过任务栏上的菜单。即使显示了 UI,您也可以通过任务栏访问 UI。这样做的缺点是,当显示 UI 时,您无法使用 Cmd+Tab 进入该窗口。这对于 Mac 用户来说是不直观的。如果您想使用此选项,您可以使用命令行选项“-Dapple.awt.UIElement =“true””启动java jar文件,这将阻止程序始终显示菜单,然后您需要创建一个任务栏图标,以便用户可以访问您的程序。
参见How to hide the Java SWT program icon in the Dock when the application is in the tray
2) 有 2 个可以运行的程序,一个有 UI,另一个没有。它们可以使用文件、套接字等通过进程间通信 (IPC) 进行通信。如果进程之间没有太多数据要传递,这是一个很好的解决方案。
3) 您可以在所有 UI 关闭后使用 JNI 删除应用程序上的菜单。但您需要深入研究 Mac 的 Objective C 语言。但我无法确认您是否真的可以做到这一点。
关于java - 关闭应用程序 UI 但保持 main() 代码运行,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/27671490/