【问题标题】:How to check if system tray already exists in Java如何检查Java中是否已经存在系统托盘
【发布时间】:2018-03-09 07:57:56
【问题描述】:

有什么方法可以检查系统托盘是否已经存在?当我继续运行程序以创建系统托盘时,会出现多个事件,这意味着多个程序正在运行。那么,我需要检查系统托盘是否已经存在?

【问题讨论】:

  • 什么是系统托盘?另请注意,在某些不会自动终止的程序中,您需要在 main 末尾添加 System.exit(0);
  • 我将我的程序详细信息添加到 Windows 系统托盘。但是当我转到另一个 jFrame 并回到主 jFrame 时,会出现另一个系统托盘。
  • 只是为了检查您是否在谈论这个:docs.oracle.com/javase/8/docs/api/java/awt/SystemTray.html 所以您有多个可以添加到此系统的应用程序?
  • 是的,我有。但这不起作用。我试过了。
  • Shell_NotifyIconGetRect() 如果你给你的图标一个 GUID 可能会有所帮助。这是普通的 win32,但在 Java 中必须有一种方法来调用本机函数。 docs.microsoft.com/en-us/windows/win32/api/shellapi/…

标签: java awt


【解决方案1】:

通过多个正在运行的应用程序检查托盘内容

您不能像 SystemTray 方法引用当前应用程序的 SystemTray
所以不同的应用程序不共享相同的SystemTray 状态。

SystemTray javadoc 确实表明:

每个 Java 应用程序都有一个 SystemTray 实例,它允许 应用程序在应用程序时与桌面的系统托盘交互 正在运行。

一般来说,多个正在运行的 JVM 应该在它们之间进行隔离。
因此,您的要求可能不应该通过耦合它们来解决。
如果您多次运行同一个应用程序,您应该接受每个应用程序的行为完全相同。
相反,如果您不想让同一个应用程序同时运行多次,您可以使用打开ServerSocket 连接on a specific port at the application startup 的技巧。

检查一个正在运行的应用程序中的托盘内容

您可以使用SystemTray.getTrayIcons() 返回应用程序在TrayIcon[] 对象中添加到托盘的实际图标。
您可以迭代数组元素并仅在找不到匹配项时添加TrayIcon

另外请注意,如果你添加两次相同的TrayIcon 实例,则应根据SystemTray.add() 方法抛出一个IllegalArgumentException

else if (icons.contains(trayIcon)) {
    throw new IllegalArgumentException("adding TrayIcon that is already added");    
}

【讨论】:

  • 如何使用 if 条件检查它?
  • 是的,当然。可以发一下吗?
  • @Hansana Athukorala 事实上,通过多个正在运行的应用程序检查托盘内容是不可能的。我更新以区分两种情况。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-03-29
  • 1970-01-01
  • 2019-08-21
  • 2019-03-19
  • 1970-01-01
相关资源
最近更新 更多