1

JButton があり、2 つのアクション リスナーが登録されています。Listener1最初に登録されるため、最初に実行されます。だから、私が必要とするのは、条件が一致するListener1場合、コードは Listener2実行されるべきではありません。Listener1 で条件が一致した場合に Listener2 の実行を防ぐ方法を教えてください。

JButton jbtn=new JButton();

jbtn.addActionListener(new ActionListener() {

     //Listener1
     public void actionPerformed(ActionEvent e)
     {
         if(condition==true){
             //do not execute the code of listner2
             //stop further executeion of current action
         }
     }

});


jbtn.addActionListener(new ActionListener() {

     //Listener2
     public void actionPerformed(ActionEvent e)
     {
         //some code
     }

});
4

3 に答える 3

4

あなたが物事を複雑にしすぎているように私には見えます。単純に1つのActionListenerまたはAbstractActionを使用して、ifブロックを内部にネストしないのはなぜですか。

jbtn.addActionListener(new ActionListener() {   
  public void actionPerformed(ActionEvent e) {
   if(condition) { // no need for the == true part!
     myMethod1();
   } else { // condition is false
     myMethod2();
   }
  }
});
于 2013-01-24T03:36:25.457 に答える
4

それは簡単です。AbstractButtonメソッドがありgetActionListeners()ます。そのため、以前に追加したリスナーを削除できます。次に、別のリスナー (ボタンから削除された) を呼び出すことができるリスナーを作成できます。このようなもの:

public class MyActionListener implements ActionListener {
  private ActionListener anotherListener;
  public MyActionListener(ActionListener another) {
    anotherListener = another;
  }
  public void actionPerformed(ActionEvent ae) {
    doSomething();
    if (myCondition) {
      anotherListener.actionPerformed(ae);
    }
  }
}
于 2013-01-24T07:39:21.907 に答える
2

発生している正確なイベントによっては、を使用できる場合がありますconsume() / isConsumed()。(例:java.awt.event.InputEvent

リスナーはisConsumed()何かをする前にチェックし、を呼び出しますconsume()

このように、すべてのリスナーがこの規則に従っていると仮定すると、1人のリスナーだけがイベントを取得します。したがって、1人のリスナーが外部またはライブラリクラスからのものである場合、これは役に立ちません。また、リスナーが最初にイベントを取得する順序は、ユーザーが制御できない場合があります。

したがって、@Hovercraftのオプションの方が良いかもしれません。あなたがどれだけ切り離されたいかによります。

于 2013-01-24T03:45:39.093 に答える