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

标签 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) 看起来就像我使用 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/

相关文章:

java - 如何获取 Kafka 中代理的连接字符串

java - 我应该如何在 Java 中测试私有(private)方法?

c - 如何从 Mac 制作 Windows CLI

phpmyadmin - 无法编辑 config.inc.php

java - 创建一个桌面应用程序以将我们的输入状态显示为图形

java - JFrame 的默认图标在动态更新期间间歇性地显示在 Win 任务栏中

java - 延迟初始化单例期间的数据竞争和竞争条件

java - 从内部类访问外部类 : Why is it done this way?

macos - 可靠地创建 .DS_Store 文件

java - 在 Java 中实现通用 switch 语句