【问题标题】:Accessing JMenuItems from JMenuBarbar in Java?在 Java 中从 JMenuBarbar 访问 JMenuItems?
【发布时间】:2014-06-07 17:11:19
【问题描述】:

我现在正在专门在菜单栏上使用一些 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() 调用,我可以获取“文件”元素,但是当我执行第二个循环以查找“文件”下方的项目时,包括名称在内的大多数属性都为空,甚至虽然我已经设置了名字。

在调试器中,我可以看到我在监视 subItems[j].getComponent() 时设置的名称,在标记为“组件”的部分下,然后在“元素数据 [0]”下。

我确定有办法获得此属性,但我无法弄清楚如何。有谁知道如何访问它或知道区分 MenuItems 和 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;
}

【问题讨论】:

    标签: java user-interface menuitem jmenu jmenubar


    【解决方案1】:

    您必须再次向下钻取的原因是每个 JMenu 子项都是在 JpopupMenu 容器中创建的。所以文件菜单有 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
                        }
                    }
                }
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-10-20
      相关资源
      最近更新 更多