Java的:任务栏图标右键点击MAC OSX禁用(java: TrayIcon right clic

2019-09-01 23:23发布

我试图制定一个系统托盘图标提供的MAC OSX的应用程序,所以用最简单的代码中的第一次尝试去实现它之后我注意到,每一个应用程序托盘图标的(系统和用户应用程序)在Mac OSX(10.8)允许激活相对弹出菜单上都,但与我的项目只有左(MouseEvent.BOTTON1)按钮会弹出菜单,下拉左,右键单击。 这里是我的代码:

public class SystemTrayDemo
{
    private SystemTray tray;
    private TrayIcon tray_icon;

    public SystemTrayDemo()
    {
        if (!SystemTray.isSupported())
        {
            JOptionPane.showMessageDialog(null, "System tray not supported!");
            return;
        }
        else
           tray = SystemTray.getSystemTray();

        final PopupMenu popup = new PopupMenu(); 

        MenuItem exit = new MenuItem("Exit");

        exit.addActionListener(new ActionListener()
        {
            public void actionPerformed(ActionEvent e)
            {
                if (tray != null)
                {                    
                    tray.remove(tray_icon);
                    System.exit(0);
                }
            }
        });

        popup.add(exit);

        //add tray icon
        tray_icon = new TrayIcon(getIcon("images/wifi.png"), "Open documents...", popup);
        tray_icon.setImageAutoSize(true);

        try
        {            
            tray.add(tray_icon); // adds icon
        }
        catch (AWTException ex) {}
    }


    private Image getIcon(String name)
    {
        URL _url = getClass().getResource(name);
        return new ImageIcon(_url).getImage();
    }

    public static void main(String args[])
    {
        new SystemTrayDemo();
    }
}

但如何我已经说过,只有通过鼠标左键点击。 因此,进一步的尝试过程中我试图模仿使用的MouseListener和使用dispatchEvent()方法,像这样上右键单击事件触发左键事件所有其他应用程序的托盘图标的行为:

    public static void fireMouseEvent(Component c)
    {
        MouseEvent me = new MouseEvent(c, // which
                    MouseEvent.MOUSE_CLICKED, // what
                    System.currentTimeMillis(), // when
                    MouseEvent.BUTTON1_MASK, // no modifiers
                    0, 0, // where: at (10, 10}
                    1, // only 1 click 
                    true); // popup trigger

        c.dispatchEvent(me);
    }

该活动由鼠标监听处理,但很明显的TrayIcon类不是一个组件的子类,因此的MouseEvent的来源是零,我也得到一个NPE。 这里是我的MouseListener:

    class MouseAdapt extends java.awt.event.MouseAdapter
    {

        public void mouseClicked(java.awt.event.MouseEvent me)
        {
            int button = me.getButton();

            if(button == java.awt.event.MouseEvent.BUTTON3)
            {
                fireMouseEvent(me.getComponent());
            }
        }
    }

    try
    {            
        tray.add(tray_icon); // aggiungi l'icona
        tray_icon.addMouseListener(new MouseAdapt());
    }
    catch (AWTException ex) {}

对不起,我的英语,我希望谁曾经有过一些经验与同类项目有人能帮助我。 我搜索了几个小时,但没有运气。 谢谢您的帮助。

Answer 1:

编辑:现在有工作在这里解决所有的这个库: https://github.com/dorkbox/SystemTray


激活[任务栏图标]相对弹出菜单左,右键点击

这是根本不可能在Mac + Java的目前。 使用反射来调用底层的触发器似乎并没有帮助。 这是一个错误。

https://bugs.openjdk.java.net/browse/JDK-8041890

只有左(MouseEvent.BOTTON1)按钮会弹出菜单下拉。 这里是我的代码

即使这是在某些版本的Java(7u79),固定升级破...

https://bugs.openjdk.java.net/browse/JDK-7158615

跨平台支持的TrayIcon:

尽管略有题外话,我想补充,有些项目使用JXTrayIcon完成在Linux / Windows的,等一些奇特的下拉菜单中的这些也导致在Mac问题,尽管它已经从今天受到点击的bug以及错误与GNOME3需要一个完全独立的黑客 。 但在Mac上,任何企图利用装饰菜单会使苟延残喘的菜单,是最终用户一个非常糟糕的经历。 我对入驻的解决方案是使用AWT的Mac,对于摇摆一切 。 Java的任务栏图标的支持是一个重写的迫切需要。 JavaFX的要求,以帮助这一举措,但它上演的Java 9 。 在此同时,我坚持与操作系统有关的黑客 。

相关托盘的问题在其他平台

此外,一些Linux发行版如Ubuntu已经删除默认在桌面统一的托盘图标,造成进一步的头痛。 https://askubuntu.com/a/457212/412004

另外,图标的透明度被替换为对于GTK /侏儒或QT / KDE供电桌面(两者的OpenJDK和Oracle JRE受此)灰色https://stackoverflow.com/a/3882028/3196753 HTTP:// bugs.java.com/bugdatabase/view_bug.do?bug_id=6453521

此外,GNOME3供电桌面可以显示它在错误的角落里,一点都没有,或者它可能会显示,但无法点击(OpenJDK的都和Oracle JRE受此) https://bugs.debian.org/cgi-bin/bugreport。 CGI?错误= 660157 https://bugzilla.redhat.com/show_bug.cgi?id=1014448

除此之外,在Windows的高DPI屏幕上有错误地绘制图标中的错误: Windows 8的歪曲我的任务栏图标

因此,在总结,系统托盘的Java中的状态是正常的,但由于多种因素的组合在JDK6,JDK7和JDK8相当分散和马车。



文章来源: java: TrayIcon right click disabled on Mac OsX