我有一个菜单,作为JMenuItem开始。当它被选中时,我希望它的动作监听器用带子菜单项的菜单替换那个菜单项。如何用JMenu替换JMenuItem(无需重新排序)
我试过使用parentMenu.remove(subMenuItem); parentMenu.add(subMenu);
,但是这会将菜单移动到其父项菜单项的底部。我希望它保持在父母菜单项中的位置。
我是否必须重新创建父菜单?
(我可以写/提供SSCCE如果你真的认为这是必要的。)
我有一个菜单,作为JMenuItem开始。当它被选中时,我希望它的动作监听器用带子菜单项的菜单替换那个菜单项。如何用JMenu替换JMenuItem(无需重新排序)
我试过使用parentMenu.remove(subMenuItem); parentMenu.add(subMenu);
,但是这会将菜单移动到其父项菜单项的底部。我希望它保持在父母菜单项中的位置。
我是否必须重新创建父菜单?
(我可以写/提供SSCCE如果你真的认为这是必要的。)
使用
Container.add(component, index);
方法插入菜单,无论你想。
当然,您需要通过使用另一个Container
方法遍历容器中的所有组件来找到合适的索引。
我发现(和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)。)
谢谢!我刚刚发现添加(菜单,索引),并想知道如何获得索引...搜索堆栈溢出我找到.getComponentZOrder,但这是返回-1(找不到?)。我最终迭代了父菜单组件并在找到时将其替换...我将尽快写出一个答案。 – geowar