java - 如何检测托盘是否已经运行或禁用多次运行

标签 java system tray

我通过java创建了一个TrayIcon。 但我有一个问题,如果你运行可运行的 jar 文件,它会再次创建同一个托盘。 有没有办法让它只打开一个托盘? 或者检查托盘是否已经存在并且不运行托盘?

enter image description here

最佳答案

多次运行 jar 意味着启动多个应用程序(和 JVM),并且每个 Java 应用程序都有一个 SystemTray 实例。
来自SystemTray javadoc:

Every Java application has a single SystemTray instance that allows the app to interface with the system tray of the desktop while the app is running. T

因此,您应该使用主策略来检测应用程序是否已经运行,或者更简单地阻止应用程序运行多次。
创建一个服务器套接字,并在应用程序启动时绑定(bind)到特定端口(例如使用 ServerSocket 实例)是一种简单的方法。
以下是检测到抛出异常的示例:

public static void main(String[] args) {       
    assertNoOtherInstanceRunning();
    ...     // application code then        
}

public static void assertNoOtherInstanceRunning() {       
    new Thread(() -> {
        try {
            new ServerSocket(9000).accept();
        } catch (IOException e) {
          throw new RuntimeException("the application is probably already started", e);
        }
    }).start();       
}

关于java - 如何检测托盘是否已经运行或禁用多次运行,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/49674277/

相关文章:

c - 从第一个字符串中的第二个字符串中删除所有出现的所有字符

Java Swing - 如何覆盖托盘 'displayMessage' 弹出窗口?

java - DB 机器 CPU 周期与中端机器 CPU 周期

java - 正则表达式 PatternSyntaxException 错误

java - 如何在 HashMap 中存储关于唯一键的多个值

mysql - 酒店预订系统数据库架构

java - 将映射器输出发送到不同的 reducer

ruby - 通过 system() 从 Ruby 调用 iconv

macos - 在Mac上为基于Electron的App提供不同的Dock和Tray图标吗?