如何用JMenu替换JMenuItem(无需重新排序)

时间:2017-10-11 16:25:30

标签: java swing menu

我有一个以JMenuItem开头的菜单。当它被选中时,我希望它的动作监听器用带有子菜单项的菜单替换该菜单项。

我尝试使用parentMenu.remove(subMenuItem); parentMenu.add(subMenu);,但这会将菜单移到其父菜单项的底部。我希望它保留在父母菜单项中的位置。

我是否必须重新创建父菜单?

(如果您认为有必要,我可以写/提供SSCCE。)

2 个答案:

答案 0 :(得分:1)

使用

Container.add(component, index);

将菜单插入任何地方的方法。

当然,您需要使用另一个Container方法来迭代容器中的所有组件,以找到适当的索引。

答案 1 :(得分:0)

我发现(和camickr建议)我使用.add(subMenu, index);导致询问“我如何在父菜单中找到我的索引?”。搜索堆栈溢出,我发现.getComponentZOrder(),但总是返回-1(未找到?)。所以我最终选择了这个:

    for (int i = 0; i < parentMenu.getMenuComponentCount(); i++) {
        if (parentMenu.getMenuComponent(i) == subMenuItem) {
            checkMenu.remove(subMenuItem);
            checkMenu.add(subMenu, i);
            break;
        }
    }

编辑:我也找到了.getComponentZOrder()方式:

Container container = subMenuItem.getParent();
if (container != null) {
    int index = container.getComponentZOrder(subMenuItem);
    if (index > -1) {
        checkMenu.remove(subMenuItem);
        checkMenu.add(subMenu, index);
    }
}

(这是另一行代码,我怀疑.getComponentZOrder几乎正在做同样的工作,所以我可能只是自己去迭代子菜单(Item)。)