1. ホーム
  2. java

[解決済み] MenuListenerの実装、どのJMenuがクリックされたかを検出する方法は?

2022-02-18 15:32:17

質問

を定義した場合 JMenuJMenuBar このように

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

をクリックすると、どのメニューからクリックされたのか区別がつきません。どうすればよいのでしょうか?

解決方法は?

を使用することができます。 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 が提案したように、これを削除しました。)