2017-10-11 74 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)。)