2

私が定義JMenuしてJMenuBarこのようにした場合:

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) {}

今では正常に動作します。しかし、問題は、複数のメニューがある場合、どうすれば 2 つを区別できるかということです。メニュー リスナーと同様に、メニュー 1 または別のメニュー 2 からクリックが発生したことをどのように知ることができますか?

別のメニューがあり、このメニューにもメニューリスナーを追加する場合:

jMenu2.addMenuListener(this);

次に、クリックがどのメニューからのものであるかを区別できません。どうやってやるの?

4

6 に答える 6

5

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) {
        }
    });

2 番目のオプションを選択すると、ActionListener代わりに簡単に使用できますMenuListener。(menuCanceled と menuDeselected の操作をしたくない場合のみ)(コメントで@Kleopatraが提案したようにこれを削除しました)

于 2011-12-21T12:15:44.127 に答える
2

から継承getSource()するメソッドです。MenuEventEventObject

于 2011-12-21T12:14:31.723 に答える
1

代わりに使用できますActionListener。メニュー項目のクリックをキャプチャする方法は次のとおりです

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

クリックしたときに同じコードを共有するメニューが複数ある場合は、アクション リスナーを別のクラスにリファクタリングできます。

于 2011-12-21T12:19:06.277 に答える
0

方法の1つは、追加または追加ButtonModelすることで、それも快適に解決できると思います。たとえば、ButtonModelの場合JMenuItemJMenuItemsButtonGroup

于 2011-12-21T12:14:57.310 に答える