2011-12-21 5 views
3

Если я определил JMenu и JMenuBar так:Реализация 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) {} 

Сейчас он работает отлично. Но проблема в том, что если у меня есть более одного меню, как я могу различать их. Как в меню прослушивателя, как бы я знал, что клик пришел из меню1 или другого меню 2?

Я имею в виду, если у меня есть еще одно меню и я добавить меню слушателя для этого меню, а также:

jMenu2.addMenuListener(this); 

тогда я не могу отличить от того, какое меню щелчок пришел. Как я могу это сделать?

+0

Использование MenuListeners необычно, что вызывает обычный вопрос: почему, по-вашему, вам это нужно? – kleopatra

ответ

6

Вы можете использовать getSource() метод MenuEvent класса. Или вы также можете добавить отдельных слушателей в оба меню как анонимный класс.

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. (Только если вы не хотите выполнять операции над менюОтменить и menuDeselected) (удалил это, как рекомендовал @Kleopatra в комментарии)

+0

-1 ActionListener - это _not_ альтернатива ... также см. Мой комментарий к @GETah) +1 для getSource - в сумме нуль :-) – kleopatra

+0

@ kleopatra: Я предложил ActionListener, потому что я думал, что он только хочет сделать операцию при нажатии меню то нет необходимости добавлять дополнительные методы для этого. Добавление ActionListener с помощью одного метода будет выполнять эту работу. Вот почему я также упомянул о своем ответе на то, что * (Только если вы не хотите выполнять операцию в меню «Отметить» и «menuDeselected») *. Но может быть, я ошибаюсь в этом, поскольку вы говорите, что не рекомендуется добавлять слушателя действий в меню. Также 'downvote + upvote = 8 rep.'; p –

+0

ну, ошибка в том, что ActionListener, зарегистрированный на JMenu, делает точно ... ничего :-) – kleopatra

2

Это то, что getSource() для, что является методом MenuEvent наследует от EventObject.

0

Я думаю, что один из способов является добавление ButtonModel к JMenuItem или добавить JMenuItems к ButtonGroup может решить confortly, что тоже пример для ButtonModel

+0

нет, а) редко нужно прикоснуться к модели меню. B) ButtonGroup не имеет никакого отношения к какому-либо аспекту вопроса (вернется, если у вас получится волшебное будущее, смотрящее в глаза :-) – kleopatra

1

Вместо этого вы можете использовать ActionListener. Вот как вы можете захватить щелчок на элементе

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

меню Если у вас есть более чем одно меню обмена один и тот же фрагмент кода при нажатии, то вы можете реорганизовать слушатель действий в отдельный класс.

+0

технически некорректно, вопрос о _JMenu_ not a _JMenuItem_ (воздерживаясь от нисходящего голосования на данный момент, поскольку, вероятно, получится, что прослушивание действий действительно будет реальным требованием :) – kleopatra

Смежные вопросы