2009-08-30 4 views
2

Il semble y avoir well-known il y a un bug lors de l'utilisation de JMenuItem.getRootPane(). J'ai lu la description du bogue mais je n'arrive pas à trouver une solution. Connaissez-vous le code de contournement pour cela dans une méthode Action.actionPerformed()?JMenuItem.getRootPane() solution de contournement?

Mise à jour: J'obtiens ceci maintenant mais cela ne fonctionne pas avec les sous-menus.

public void actionPerformed(ActionEvent e) { 
     Component c = (Component) e.getSource(); 
     if (c instanceof JMenuItem) { 
      c = ((JPopupMenu)((JMenuItem)c).getParent()).getInvoker(); 
     } 

     Component z = SwingUtilities.getRootPane(c); 
    } 

Répondre

2

Intéressant. Vous ne pouvez pas continuer à utiliser getParent() car chaque sous-menu a son propre menu contextuel. Vous devez donc trouver tous les menus dans la chaîne jusqu'à ce que vous trouviez un JMenu avec un JMenuBar comme parent. Vous pouvez ensuite utiliser ce menu pour rechercher le volet racine. Quelque chose comme ceci:

public JMenu getMenuBarMenu(JMenuItem item) 
{ 
    JMenuItem menu = null; 

    while (menu == null) 
    { 
     JPopupMenu popup = (JPopupMenu)item.getParent(); 
     item = (JMenuItem)popup.getInvoker(); 

     if (item.getParent() instanceof JMenuBar) 
      menu = item; 
    } 

    return (JMenu)menu; 
} 
0

Pour obtenir ce travail de contournement avec sous-menu, vous aurez besoin d'ajouter un autre .getParent() Exemple: ((JPopupMenu) ((JMenuItem) ((JMenuItem) c) .getParent ()). getParent()). getInovker();

1

Vous pourriez trouver plus facile d'initialiser le Action avec tout ce dont il a besoin de travailler, et si nécessaire pour créer des instances d'action distinctes pour chaque contexte (chaque fenêtre, ou autre). Certes, le code sera plus facile à lire. :)

+0

Je l'avais avant mais je ne pense pas que le code soit plus facile à lire et je ne peux pas utiliser les arguments par défaut d'Action contructor w/o. Je vous remercie. – PeterMmm

Questions connexes