我有一個菜單,作爲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