【问题标题】:How to detect single clicks to System TrayIcon for Java App?如何检测对 Java App 的 System TrayIcon 的单击?
【发布时间】:2012-08-29 18:08:15
【问题描述】:

我正在开发一个简单的 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 吗? (听说MouseListeners会出问题,ActionListeners更好)

【问题讨论】:

  • 什么平台?视窗? Linux?

标签: java swing actionlistener system-tray trayicon


【解决方案1】:

你可以使用MouseListener,即:

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

        }
    }
}); 

请参阅How to Write a Mouse Listener 了解更多详情。

编辑:ActionListener vs MouseListener

有一个低级和语义事件的概念。只要有可能,您应该监听语义事件而不是低级事件,例如监听动作事件,而不是鼠标事件。阅读Low-Level Events and Semantic Events了解更多详情。

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

【讨论】:

  • MouseListeners 和 ActionListeners 首选是不是有问题?
  • @ClickUpvote 看看我上次的编辑是否可以阐明 ActionListener 和 MouseListener 之间的区别。
  • 可能还想检查是否 e.getID() == MouseEvent.MOUSE_CLICKED 除非您只想响应“鼠标按下”通知(您可能会...)
  • @rogerdpack mouseClicked 在组件上单击(按下和释放)鼠标按钮时调用。
  • 啊,我正在添加一个鼠标监听器,它报告了所有这些,好的,谢谢你清除它。
猜你喜欢
  • 1970-01-01
  • 2013-01-18
  • 2011-09-28
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多