在Java中从JMenuBarbar访问JMenuItems?

时间:2014-06-07 17:11:20

标签: java user-interface menuitem jmenu jmenubar

我现在正在菜单栏上专门处理一些java代码,但是我无法从JMenuBar访问菜单项。菜单栏有一个项目JMenu,JMenu里面有一个JMenuItem,我正在尝试访问JMenuItem,通过name属性区分项目(这只是我发现区分它们的一种方式,如果有人知道更好的话这样做的方法请告诉我。)我在应用程序中切换标签的on-change事件中这样做,所以这是我的代码。

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

menuItems来自JMenuBar上的getSubElements()调用,我可以得到'File'元素,但是当我执行第二个循环来查找'File'下面的项目时,包括name在内的大多数属性都是null,甚至虽然我已经设定了名字。

在调试器中,我可以看到我在subItems [j] .getComponent()上进行监视时设置的名称,在标记为“component”的部分下,然后在“element data [0]”下面。

我确信有一种方法可以达到这个属性,但我无法弄清楚如何。有没有人知道如何访问它或知道更好的方法来区分MenuMtems和JMenuBar?

感谢。

编辑 - 我明白了。如果有人好奇,JMenuItem嵌套在JMenu的另一层中。此代码打印出我试图找到的名称。

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

话虽如此,我不知道为什么会这样。有人知道吗? 以下是构建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;
}

1 个答案:

答案 0 :(得分:2)

您必须再次向下钻取的原因是每个JMenu子项都是在JpopupMenu容器中创建的。所以File Menu有了JPopupMenu容器,它有你的importTiles JMenuItem。 所以代码可以像这样改变:

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