java: TrayIcon clic droit désactivé sur Mac OsX


J'essaie de développer une application Mac OsX fournie par une icône de barre d'état système, donc après la première tentative avec le code le plus simple pour y parvenir, j'ai remarqué que chaque icône de barre d'état des applications (applications système et utilisateur) sur mac osX (10.8) permet d'activer le menu contextuel relatif avec un clic gauche et droit dessus mais avec mon projetBOTTON1) bouton provoque le menu contextuel à pulldown. Voici mon code:

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();
    }
}

Mais comme je l'ai déjà dit, seulement par le bouton gauche de la souris cliquer. Ainsi, lors d'une nouvelle tentative, j'ai essayé d'imiter le comportement des icônes de la barre d'état de toutes les autres applications en utilisant un MouseListener et en déclenchant un événement de bouton gauche sur un événement de clic droit en utilisant la méthode dispatchEvent () comme ceci:

    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);
    }

L'événement sera géré par l'écouteur de la souris mais évidemment la classe TrayIcon n'est pas une sous-classe de composant et donc la source de MouseEvent est null et j'obtiens un NPE. Voici mon 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) {}

Désolé pour mon anglais, j'espère que quelqu'un qui ont jamais eu une certaine expérience avec ce genre de projets peut m'aider. J'ai cherché pendant des heures mais sans chance. Je Vous remercie pour votre aide.

Author: wiredolphin, 2013-05-05

1 answers

Edit:, Il y a maintenant une bibliothèque de travail pour corriger tout cela ici: https://github.com/dorkbox/SystemTray


Pour activer le menu contextuel relatif [TrayIcon] avec un clic gauche et droit

Ce n'est tout simplement pas possible sur Mac + Java actuellement. L'utilisation de la réflexion pour appeler les déclencheurs sous-jacents ne semble pas aider. C'est un bug.

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

Seulement la gauche (MouseEvent.BOTTON1) bouton provoque le menu contextuel à pulldown. Voici mon code

Même ceci est cassé dans certaines versions de Java (7u79), corrigé avec une mise à niveau...

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

Prise en charge multiplateforme de TrayIcon:

Bien que légèrement hors sujet, je voulais ajouter, certains projets utilisent un JXTrayIcon pour accomplir des menus déroulants fantaisistes sous Linux/Windows, etc. Ceux-ci causent également des problèmes sur Mac malgré un click-bug il souffre déjà aujourd'hui ainsi que des bugsavec Gnome3 nécessitant un hack complètement séparé . Mais sur Mac, toute tentative d'utiliser les menus décorés entraîne la persistance du menu et constitue une très mauvaise expérience pour l'utilisateur final. La solution sur laquelle je me suis installé était d'utiliser AWT pour Mac, Swing pour tout le reste. Le support Java TrayIcon a grandement besoin d'une réécriture. JavaFX prétend aider cette initiative, mais c'est mis en scène pour Java 9. Dans le temps de le dire, Je m'en tiens à Hacks dépendant du système d'exploitation.

Problèmes liés à la barre d'état pour d'autres plates-formes

De plus, certaines distributions Linux comme Ubuntu ont supprimé l'icône de la barre d'état par défaut dans le bureau Unity, provoquant d'autres maux de tête. https://askubuntu.com/a/457212/412004

De plus, la transparence de l'icône est remplacée par une couleur grise sur les ordinateurs de bureau alimentés par Gtk/Gnome ou Qt/KDE (OpenJDK et Oracle JRE souffrent tous les deux ce) https://stackoverflow.com/a/3882028/3196753 http://bugs.java.com/bugdatabase/view_bug.do?bug_id=6453521

De plus, les ordinateurs de bureau alimentés par Gnome3 peuvent l'afficher dans le mauvais coin, pas du tout, ou il peut montrer mais être non cliquable (OpenJDK et Oracle JRE souffrent de cela) https://bugs.debian.org/cgi-bin/bugreport.cgi?bug=660157 https://bugzilla.redhat.com/show_bug.cgi?id=1014448

En plus de cela, les écrans haute résolution sur Windows ont un bug qui dessine l'icône de manière incorrecte: Windows 8 déforme mon TrayIcon

Donc en résumé, l'état de la barre d'état système en Java est OK, mais en raison de la combinaison de facteurs est assez fragmenté et bogué dans JDK6, JDK7 et JDK8.

 2
Author: tresf, 2017-05-23 12:32:32