我正在尝试关闭我的主应用程序用户界面,但是在启动应用程序的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程序之间进行通信,但我需要来回传递大量数据,所以我不喜欢这个选项。
答案 0 :(得分:0)
似乎没有一种简单的方法可以做到这一点。对于那些有同样问题的人来说,有几个选择:
1)它看起来像我使用Mac的任务栏(在屏幕的右上角)执行此操作的其他程序。访问程序的唯一方法是通过任务栏上的菜单。即使您显示了UI,也可以通过任务栏进入UI。这样做的缺点是,当显示UI时,您无法使用Cmd + Tab来切换到窗口。这对Mac用户来说是不直观的。如果要使用此选项,可以使用命令行选项“-Dapple.awt.UIElement =" true”“启动java jar文件,这将阻止程序始终显示菜单,然后您&# 39;我想创建一个任务栏图标,以便用户可以访问你的程序。
请参阅How to hide the Java SWT program icon in the Dock when the application is in the tray
2)有两个运行的程序,一个有UI,另一个没有。他们可以使用文件,套接字等使用进程间通信(IPC)进行通信。如果您没有太多数据要在进程之间传递,这是一个很好的解决方案。
3)在所有UI关闭后,您可以使用JNI删除应用程序上的菜单。但是你需要深入研究Mac的Objective C语言。我无法证实你实际上可以做到这一点。