考虑以下代码:
mntmProfilesDelete.get(index).addActionListener(new ActionListener(){
@Override
public void actionPerformed(ActionEvent e) {
JMenuItem eMntm = (JMenuItem) e.getSource();
String text = eMntm.getText();
Component[] mns = mnDelete.getParent().getComponents();
for(Component mn : mns)
{
System.err.println((String)(((JMenu)mn).getText()));
if(mn instanceof JMenu && ((JMenu)mn).getText().toLowerCase().equals("open"))
{
System.err.println((String)(((JMenu)mn).getText()));
Component[] mntms = ((JMenu) mn).getComponents();
for(Component mntm : mntms)
{
System.err.println((String)(((JMenu)mn).getText())+"\n"+(String)(((JMenuItem)mntm).getText()));
if(mntm instanceof JMenuItem && ((JMenuItem)mntm).getText().toLowerCase().equals(text.toLowerCase()))
{
System.err.println((String)(((JMenu)mn).getText())+"\n"+(String)(((JMenuItem)mntm).getText()));
((JMenu)mn).remove((JMenuItem)mntm);
}
}
}
}
mnDelete.remove(eMntm);
}
}
我用来删除两个菜单项,如下所示:
(jmenu)father
(jmenu)open
(jmenuitem)item1
(jmenuitem)item2
etc
(jmenu)delete
(jmenuitem)item1
(jmenuitem)item2
etc
动作侦听器附加到-item1-下面的-delete -
出于某种原因,使用上面的代码不会删除-item1- under-open-。我似乎无法理解为什么。
非常感谢。答案 0 :(得分:0)
JMenu
的{{1}} JavaDoc说:“从此菜单中删除组件remove(Component c)
。”
AFAIC通过查看代码的最后一行来解释(我的周末心灵拒绝深入了解演员阵容 [1] ;-)和你的解释:你的这个 menu c
是 / father / delete 。您尝试删除的项目( / father / open / item1 )不在此菜单中。
[1] 为什么要将mnDelete
投射到public String getText()
?
答案 1 :(得分:0)
所以我会保存我要修改的菜单,这样我就可以轻松地执行此更改。而不是试图穿越层次结构。这将使您更容易阅读代码。例如:
public SomeApp {
JMenu openMenu;
JMenu deleteMenu;
public JMenu buildMenus(List<SomeObject> objsThatGoInMenu) {
openMenu = new JMenu("Open");
deleteMenu = new JMenu("Delete");
for( SomeObject so : objsThatGoInMenu ) {
addMenuOptions( so );
}
JMenu father = new JMenu("Father");
father.add( openMenu );
father.add( deleteMenu );
}
public addMenuOptions( final SomeObject so ) {
final JMenuItem openMenuItem = new JMenuItem( new AbstractAction( so.getName() ) {
public void actionPerformed(ActionEvent evt) {
// todo open
}
}));
final JMenuItem deleteMenuItem = new JMenuItem( new AbstractAction( so.getName() ) {
public void actionPerformed(ActionEvent evt) {
deleteMenu.remove( deleteMenuItem );
openMenu.remove( openMenuItem );
}
}));
openMenu.add( openMenuItem );
deleteMenu.add( deleteMenuItem );
}
}
答案 2 :(得分:0)
解决了它,我的代码的每个部分都应该按照它应该的方式工作,除了:
Component[] mntms = ((JMenu) mn).getComponents();
不会返回任何JMenuItems,它应该是:
Component[] mntms = ((JMenu) mn).getMenuComponents();