关闭应用程序UI但保持main()代码运行

时间:2014-12-27 21:10:06

标签: java macos swing user-interface

我正在尝试关闭我的主应用程序用户界面,但是在启动应用程序的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 个答案:

答案 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语言。我无法证实你实际上可以做到这一点。