【问题标题】:Close Application UI but keep main() code running关闭应用程序 UI 但保持 main() 代码运行
【发布时间】: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


【解决方案1】:

似乎没有一种简单的方法可以做到这一点。对于那些有同样问题的人,这里有几个选项:

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) 您可以使用 JNI 在所有 UI 关闭后删除应用程序上的菜单。但是你需要深入研究 Mac 的 Objective C 语言。不过,我无法确认您是否真的可以这样做。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2023-03-13
    • 2022-01-23
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2022-06-26
    相关资源
    最近更新 更多