2010-10-04 2 views
1

Lorsque je laisse un popup JPopupMenu sans passer le "composant invoker", le menu ne fonctionne pas: les sous-menus ne s'ouvrent pas et ne sont pas repeints. Mais quand je crée un JFrame complètement inutile avec un JLabel dedans, et je passe le JLabal comme invocateur, cela fonctionne correctement ...Java: Afficher JPopupMenu sans passer un composant invoker

Toutes les suggestions, comment éviter de créer un cadre inutile. Et mon application n'a vraiment pas de cadres ouverts, il suffit de faire apparaître un menu simple.

JPopupMenu.show(null, xOnTheScreen, yOnTheScreen); // Doesn't work 
JPopupMenu.show(aStupidJLabelInAStupidJFrame, x, y); // Works 

Merci

+1

Votre application de swing doit être dans un certain JPanel, à tout le moins. N'est-ce pas? –

+0

Si vous utilisez le menu contextuel en tant que pop-up pour une icône de la barre d'état du bureau, vous n'aurez aucun composant à utiliser pour le paramètre invoker. Je me souviens d'avoir un problème similaire. – Durandal

Répondre

1

Jetez un oeil à JPopupMenu code source et vous verrez pourquoi vous devez définir un invocateur. Montrer un menu contextuel sans aucun composant existant serait une très mauvaise utilisation, au même titre que les fenêtres contextuelles d'un navigateur. Pourquoi ne pouvez-vous pas utiliser JComponent#setComponentPopupMenu, ou ajouter un écouteur de souris au composant dans lequel vous voulez afficher le menu contextuel?

Pourquoi ne pouvez-vous pas utiliser JComponent#setComponentPopupMenu?

+0

J'ai déjà jeté un coup d'oeil dans le code, mais je ne vois pas pourquoi ... –

+0

Rechercher 'JPopupMenu # getInvoker' dans JDK6 vous verrez toute une série de références. Ce n'est vraiment pas une bonne idée de changer un tel comportement et une telle supposition. –

Questions connexes