2014-06-07 1 views
0

Je travaille actuellement avec du code java sur une barre de menu et j'ai du mal à accéder à un élément de menu depuis un JMenuBar. La barre de menu a un élément JMenu, et le JMenu a un JMenuItem, j'essaie d'accéder à JMenuItem, en différenciant les éléments par l'attribut name (c'est juste une façon de les différencier, si quelqu'un sait mieux façon de le faire s'il vous plaît faites le moi savoir.) Je le fais sur l'événement on-change dans les onglets de commutation dans mon application, alors voici mon code.Accéder à JMenuItems à partir de JMenuBarbar en Java?

public void stateChanged(ChangeEvent e) { 
    if(tabbedPane.getSelectedIndex() != 0){ 
     for(int i = 0; i < menuItems.length; i++){ 
      MenuElement[] subItems = menuItems[i].getSubElements(); 
      for(int j = 0; j < subItems.length; j++){ 
        System.out.println(subItems[j].getComponent().getName()); 
      } 
     } 
    } 
} 

Les menuItems provient d'un getSubElements() appelle la JMenuBar, je peux obtenir l'élément « Fichier », mais quand je fais la deuxième boucle pour trouver l'élément sous « Fichier » la plupart des attributs dont le nom sont null, même si j'ai déjà défini le nom.

Dans le débogueur, je peux voir le nom que j'ai défini lors de la surveillance de subItems [j] .getComponent(), dans une section intitulée 'component', puis sous 'element data [0]'.

Je suis sûr qu'il y a un moyen d'accéder à cet attribut, mais je n'ai pas été capable de comprendre comment. Est-ce que quelqu'un sait comment accéder à ceci ou savoir un meilleur moyen de distinguer entre MenuItems d'un JMenuBar?

Merci.

EDIT - Je l'ai compris. Si quelqu'un est curieux, JMenuItem a été imbriqué dans une autre couche dans le JMenu. Ce code imprime le nom que j'essayais de trouver.

public void stateChanged(ChangeEvent e) { 
    if(tabbedPane.getSelectedIndex() != 0){ 
     for(int i = 0; i < menuItems.length; i++){ 
      MenuElement[] subItems = menuItems[i].getSubElements(); 
      for(int j = 0; j < subItems.length; j++){ 
       MenuElement[] subSubItems = subItems[j].getSubElements(); 
       for(int k = 0; k < subSubItems.length; k++){ 
        System.out.println(subSubItems[k].getComponent().getName()); 
       } 
      } 
     } 
    } 
} 

Cela étant dit, je ne sais pas pourquoi cela est. Quelqu'un sait-il? Voici le code qui construit le JMenuBar:

public void buildMenu(){ 
    menuBar = frame.getJMenuBar(); 
    menu = new JMenu("File"); 
    menu.setName("file"); 
    menuBar.add(menu); 
    importTiles = buildImportTilesMenuItem(); 
    menu.add(importTiles); 
} 

public JMenuItem buildImportTilesMenuItem(){ 
    importTiles = new JMenuItem("Import Tiles"); 
    importTiles.setName("importTiles"); 
    importTiles.addActionListener(this); 
    return importTiles; 
} 

Répondre

2

La raison pour laquelle vous devez faire est de nouveau forer vers le bas que chaque éléments enfants JMenu sont créés dans un conteneur JPopupMenu. Ainsi, le menu Fichier a le conteneur JPopupMenu qui a votre importTiles JMenuItem. Donc le code peut être changé comme ceci:

MenuElement[] topLevelElements = frameApp.getJMenuBar().getSubElements(); 
      //Get top level elements--> FileMenu etc 
      for(MenuElement menuElement: topLevelElements) 
      { 
       MenuElement[] subElements = menuElement.getSubElements(); 
       //get the child elements which are of type JPopupMenu 
       for(MenuElement subElement:subElements) 
       { 
        //This is the popuMenu which contains child elements 
        System.out.println(subElement.toString()); 
        if(subElement instanceof JPopupMenu) 
        { 
         //show child elements 
         for(MenuElement childMenuItem:subElement.getSubElements()) 
         { 
          //New and Save here ... 
          System.out.println("ChildMenu Name=>" + childMenuItem.getComponent().getName()); 
         } 
        } 
        else 
        { 
         //display names directly 
        } 
       } 
      } 
Questions connexes