2014-09-20 123 views
0

考慮下面的代碼:刪除菜單項遠程

  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-低於-open-不會使用上述代碼刪除。我似乎無法理解爲什麼。

非常感謝。

回答

0

解決了這個問題,我的代碼各部分的工作,因爲它應該除外:

Component[] mntms = ((JMenu) mn).getComponents(); 

不返回任何JMenuItems,它應該是:

Component[] mntms = ((JMenu) mn).getMenuComponents(); 
0

JMenuremove(Component c) JavaDoc的說:‘從菜單移除組件c

AFAIC從看你的代碼的最後一行解釋(我的週末頭腦拒絕通過鑄造嘉豪挖[1] ;-)和你的解釋:你的這個菜單mnDelete/父親/刪除。您嘗試刪除的項目(/father/open/item1)不在菜單中。

[1]爲什麼你會鑄造public String getText()(String)

+0

字符串演員陣容是因爲奇怪的日食錯誤,不知何故將其關閉。我的問題是它永遠不會進入For(mntm:mntms)循環,它甚至不能刪除。最後刪除(emntm)完美地工作,刪除item1下面刪除菜單 – Ramin 2014-09-20 16:16:22

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); 
} 
} 
+0

相信我,如果事情就像保持openItems的指針一樣簡單,我將永遠不會經歷所有的麻煩。 – Ramin 2014-09-20 16:14:16

+0

那麼你爲什麼不解釋爲什麼不行?你的代碼佔90%,實際上10%。據我可以告訴它只是刪除相應的菜單項,以刪除菜單中的內容。 – chubbsondubs 2014-09-20 18:23:47

+0

是的。這就是我想要做的。可悲的是沒有指示物品的指示,所以這就是爲什麼我必須走這麼長的路。 – Ramin 2014-09-20 19:19:35