2011-12-21 96 views
3

如果我已經定義JMenuJMenuBar這樣的:MenuListener實現,如何檢測哪個JMenu被點擊?

private JMenuBar jMenuBar; 
private JMenu jMenu1; 

jMenuBar = new JMenuBar(); 
jMenu1 = new JMenu(); 
jMenu1.setText("ABOUT"); 

//and here add a MenuListener so that i can detect when a menu is clicked: 
jMenu1.addMenuListener(this); 

jMenuBar.add(jMenu1); 
setJMenuBar(jMenuBar); 


//and here i implement the menulisteners 

public void menuSelected(MenuEvent e) { 
    //my logic here 
} 
public void menuDeselected(MenuEvent e) {} 
public void menuCanceled(MenuEvent e) {} 

現在它工作正常。但問題是如果我有更多的菜單,我怎麼區分這兩個。 就像在菜單監聽器中,我怎麼知道點擊來自menu1或另一個菜單2?

我的意思是,如果我有另一個菜單和我添加菜單監聽此菜單以及:

jMenu2.addMenuListener(this); 

然後我無法區分哪個菜單點擊來自何處。我怎樣才能做到這一點?

+0

使用MenuListeners是不尋常的 - 這引發了一個常見的問題:爲什麼你認爲你需要它? – kleopatra 2011-12-21 13:04:37

回答

6

可以使用MenuEvent類的getSource()方法。或者,您也可以將單獨的偵聽器作爲匿名類添加到這兩個菜單中。

public void menuSelected(MenuEvent e) { 
    //Make sure jMenu1 and jMenu2 are accessible in here. 
    if(e.getSource()==jMenu1) 
     operationForMenu1(); 
    else if(e.getSource()==jMenu2) 
     operationForMenu2(); 
} 

jMenu1.addMenuListener(new MenuListener() { 
     @Override 
     public void menuSelected(MenuEvent arg0) { 
      // operation here. 
     } 

     @Override 
     public void menuDeselected(MenuEvent arg0) { 
     } 

     @Override 
     public void menuCanceled(MenuEvent arg0) { 
     } 
    }); 
    jMenu2.addMenuListener(new MenuListener() { 
     @Override 
     public void menuSelected(MenuEvent arg0) { 
      // operation here. 
     } 

     @Override 
     public void menuDeselected(MenuEvent arg0) { 
     } 

     @Override 
     public void menuCanceled(MenuEvent arg0) { 
     } 
    }); 

如果選擇第二個選項,那麼它將使用方便ActionListener而不是MenuListener。 (僅當您不想在menuCanceled和menuDeselected上執行操作時)(在@Kleopatra中建議的註釋中刪除此項)

+0

-1 ActionListener是_不可替代的...也可以看到我對@GETah的評論)+1 for getSource - 總和爲零:-) – kleopatra 2011-12-21 13:19:37

+0

@kleopatra:我建議ActionListener,因爲我想如果他只想在點擊菜單上執行操作那麼不需要爲此添加額外的方法。用單一方法添加ActionListener將完成這項工作。這就是爲什麼我也提到我的答案*(只有當你不想對menuCanceled和menuDeselected進行操作時)*。但可能是我錯了,因爲你說在菜單中添加動作監聽器不是個好主意。也是'downvote + upvote = 8 rep.'; p – 2011-12-21 13:25:12

+0

好吧,錯誤是在JMenu上註冊的ActionListener完全沒有......-) :-) – kleopatra 2011-12-21 13:27:18

2

這就是getSource()的用途,這是一種方法MenuEvent繼承自EventObject

0

我想的方法之一是增加ButtonModelJMenuItem或添加JMenuItemsButtonGroup可以confortly解決過,例如用於ButtonModel

+0

不,a)很少需要觸摸菜單的模型b)ButtonGroup與問題的任何方面無關(如果它會變成你有神奇的未來尋找眼睛:-) – kleopatra 2011-12-21 13:17:13

1

您可以改爲使用ActionListener。這裏是你如何捕捉點擊菜單項

jMenu1.addActionListener(new ActionListener(){ 
    public void actionPerformed(ActionEvent e) { 
    // Perform action on menu1 clicked here 
    } 
} 

如果你有一個以上的菜單點擊,那麼你可以重構動作監聽到一個單獨的類時,共享的代碼相同的位。

+0

在技術上不正確,問題是關於_JMenu_而不是_JMenuItem_(現在避免向下投票,因爲它可能會證明傾聽行動確實會成爲真正的要求:) – kleopatra 2011-12-21 13:15:01