如何检测Java应用程序的系统托盘图标单击事件?

8
我正在开发一个简单的Java Swing应用程序,创建时会将一个图标添加到系统托盘。我想要做的是检测用户何时单击了该图标(无论是左键还是右键),没有弹出菜单,我只想在单击图标时恢复应用程序。
这是我正在使用的代码:
    SystemTray tray = SystemTray.getSystemTray(); 
    Image icon = toolkit.getImage("icon.png");

    ActionListener listener = new ActionListener()
    {
        public void actionPerformed(ActionEvent e)
        {
            System.out.println("click detected");
        }
    };

    TrayIcon trayIcon = new TrayIcon(icon, "Test Program", null);
    trayIcon.addActionListener(listener);
    tray.add(trayIcon);

当我运行这个程序时,单击(左键或右键)没有任何效果,但是当我双击时,它会在控制台中显示“检测到点击”消息。

我该怎么做才能检测到单击事件?我需要使用MouseListener吗?(我听说MouseListener可能会导致问题,而ActionListener更好)


什么平台?Windows?Linux? - Femi
1个回答

16

你可以使用 MouseListener,即:

trayIcon.addMouseListener(new MouseAdapter() {
    public void mouseClicked(MouseEvent e) {
        if (e.getClickCount() == 1) {

        }
    }
}); 

查看如何编写鼠标监听器获取更多细节。

编辑:ActionListener与MouseListener

有一个低级和语义事件的概念。只要可能,应该监听语义事件而不是低级事件,例如监听动作事件而不是鼠标事件。阅读低级事件和语义事件以获取更多详细信息。

在这种情况下,您只需要从事件中获取更多详细信息,因此需要使用MouseListener。


MouseListener和ActionListener有没有优先级问题? - Ali
@ClickUpvote,请看一下我的最后编辑是否可以澄清ActionListener和MouseListener之间的区别。 - tenorsax
你可能还想检查 e.getID() == MouseEvent.MOUSE_CLICKED,除非你只想响应“鼠标按下”通知(这也许是你想要的...) - rogerdpack
@rogerdpack mouseClicked 在组件上按下并释放鼠标按钮后被调用。 - tenorsax
好的,我现在明白了,但是你仍然有一个拼写错误,我认为你可能想要修复它。在原始帖子中,icon 是一个 Image,正如我指出的那样。TrayIcon 的实例被命名为 trayIcon。谢谢。 - The111
显示剩余3条评论

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接