2017-10-11 42 views
1

我有一个菜单,作为JMenuItem开始。当它被选中时,我希望它的动作监听器用带子菜单项的菜单替换那个菜单项。如何用JMenu替换JMenuItem(无需重新排序)

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

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

(我可以写/提供SSCCE如果你真的认为这是必要的。)

回答

1

使用

Container.add(component, index); 

方法插入菜单,无论你想。

当然,您需要通过使用另一个Container方法遍历容器中的所有组件来找到合适的索引。

+0

谢谢!我刚刚发现添加(菜单,索引),并想知道如何获得索引...搜索堆栈溢出我找到.getComponentZOrder,但这是返回-1(找不到?)。我最终迭代了父菜单组件并在找到时将其替换...我将尽快写出一个答案。 – geowar

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)。)