【问题标题】:How to remove a TrayIcon from SystemTray using Java如何使用 Java 从 SystemTray 中删除 TrayIcon
【发布时间】:2014-03-04 15:15:55
【问题描述】:

您好,我可以将 TrayIcon 添加到 SystemTray 并且可以删除相同的表单 SystemTray。

如何删除现有的 TrayIcon。我无法让可用的 TrayIcons 对象来执行此操作。

下面是我添加和删除 TrayIcon 的代码

        TrayIcon trayIcon = new TrayIcon(icon);
        SystemTray tray = SystemTray.getSystemTray();
        PopupMenu popup = new PopupMenu();
        MenuItem exit = new MenuItem("Exit");         
        popup.add(exit);

        trayIcon.setToolTip("My TrayIcon");
        trayIcon.setPopupMenu(popup); 
        tray.add(trayIcon);

        trayIcon.displayMessage("Testing",
                "Information" ,
                TrayIcon.MessageType.INFO );
        tray.remove(trayIcon);

【问题讨论】:

  • 您的意思是删除由其他应用程序添加的一个吗?
  • 不完全是,我在开始测试时添加了一个尝试图标,如果测试突然停止。图标没有被卸载。下次如果我再次运行,托盘中将添加一个图标。因此,我在系统托盘中有一堆相同的图标
  • “突然停止”是什么意思?你的意思是抛出异常吗?
  • 如果用户在测试完成之前关闭了触发批处理文件
  • 如果您的意思是进程被强制终止,那么是的,它没有机会删除其图标。这是一个 Windows 错误。如果您将鼠标移到剩余的图标上,它会突然消失。

标签: java swing icons awt system-tray


【解决方案1】:
SystemTray tray = SystemTray.getSystemTray();
        try {
            boolean exist = false;
            for(TrayIcon icon : tray.getTrayIcons() ){
                if(icon.getImage().equals(trayIcon.getImage()) && icon.getToolTip().equals(trayIcon.getToolTip())){
                    exist = true;
                    break;
                }
            }
            if(exist){
                tray.remove(trayIcon);
                                }

【讨论】:

  • 您应该使用正确格式的代码更新第一个答案吗?
【解决方案2】:

您必须从 SystemTray 中删除它。

系统托盘包含一个或多个托盘图标,这些图标使用 add(java.awt.TrayIcon) 方法添加到托盘。当不再需要它们时,可以使用 remove(java.awt.TrayIcon) 方法将它们删除。

在“How to Use the System Tray",教程中你会找到答案

【讨论】:

  • 不鼓励在 SO 上使用仅链接的答案,因为 Internet 上页面的移动性质以及 SO 的意图是答案在很长一段时间内仍然有效。如果您必须通过链接回答,请至少通过该链接提供足够多的内容,以提供发布者可以在不离开网站的情况下使用的最小答案。否则你会得到一个非常低质量的答案。
  • @mah,感谢四位您的关心。但是报价包含足够的信息,如何从中添加/删除尝试图标。有问题的OP也已按应有的方式使用它。这里的问题是 OP 想知道如何在突然退出后删除 try 图标。
【解决方案3】:

这是删除图标的正确方法,就像你做的那样

SystemTray tray = SystemTray.getSystemTray();
tray.remove(trayIcon);

但是,如果您从 Eclipse 运行应用程序,而不是处理程序窗口,您只是像“硬停止”一样停止运行,因此该图标将保留在 try 图标中,直到您将鼠标悬停在消失。

原因是 - Windows 不会监控您的程序是否仍在运行,您应该注意在停止应用程序之前关闭您的资源。

在关闭程序时尝试以某种方式运行方法closeProgram()

public void closeProgram()
{
    tray.remove(trayIcon);
    System.exit(0);
}

在我的情况下,我有一些 JFrame 窗口,所以我添加了窗口侦听器来做到这一点

addWindowListener(new WindowAdapter()
{
    public void windowClosing(WindowEvent e)
    {
        closeProgram();
    }
});

如果您使用批处理文件运行程序,我认为您将无法控制它,也许最好隐藏批处理控制台,并显示显示日志打印的简单 JFrame,但好处 - 它会有“X”按钮关闭程序。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-12-05
    • 2020-01-11
    • 2021-04-25
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多