远程删除菜单项

时间:2014-09-20 14:09:36

标签: java swing jmenu jmenuitem

考虑以下代码:

            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-。我似乎无法理解为什么。

非常感谢。

3 个答案:

答案 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();