我有一个以JMenuItem开头的菜单。当它被选中时,我希望它的动作监听器用带有子菜单项的菜单替换该菜单项。
我尝试使用parentMenu.remove(subMenuItem); parentMenu.add(subMenu);
,但这会将菜单移到其父菜单项的底部。我希望它保留在父母菜单项中的位置。
我是否必须重新创建父菜单?
(如果您认为有必要,我可以写/提供SSCCE。)
答案 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)。)