1

我有一个 JButton,为它注册了两个动作监听器。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

这很简单。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 回答
4

在我看来,好像您可能使事情过于复杂。为什么不简单地使用一个 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 回答
2

根据您要触发的确切事件,有时您可以使用consume() / isConsumed(). (例如java.awt.event.InputEvent

你的听众在做任何事情之前检查isConsumed(),然后打电话给consume().

这样,假设他们都遵循此约定,则只有一个侦听器会收到该事件。因此,如果一个听众来自外部或图书馆类,这将无济于事。并且 Listener 首先获取事件的顺序可能不在您的控制之下。

所以@Hovercraft 的选择可能会更好。取决于您希望如何解耦。

于 2013-01-24T03:45:39.093 回答