我遇到一种情况,其中JComponent需要根据类的其他字段的状态添加或删除侦听器。侦听器的添加次数不应超过一次,并且当然只能删除一次。使用类字段存储侦听器并使用null值控制向Component注册/注销侦听器的操作是否是一个好习惯。

我想到的代码是这样的(修改代码以清楚地表明JComponent是提供给该类的):

public class MyClass {
  private ActionListener fListener = null;
  private JComponent fComponent;

  public MyClass(JComponent component) {
    fComponent = component; // for example, component = new JButton("Test");
  }

  public void setListener() {
    if (fListener == null ) {
      fListener = new MyListener();
      fComponent.addActionListener(fListener);
    }
  }

  public void removeListener() {
    if (fListener != null) {
      fComponent.removeActionListener(fListener);
      fListener = null;
    }
  }
}

最佳答案

不要每次都实例化并配置侦听器对象。使用getActionListeners()方法来验证是否添加了侦听器。

public class MyClass {
  private ActionListener fListener = new MyListener();
  private JButton fComponent = new JButton("Test");

  public MyClass() {
      fComponent.addActionListener(fListener);
  }
  public void setListener() {
    if (fComponent.getActionListeners().length == 0) {
       fComponent.addActionListener(fListener);
     }
  }

  public void removeListener() {
    if (fComponent.getActionListeners().length !=0) {
      fComponent.removeActionListener(fListener);
    }
  }
}


方法ActionListener[] getActionListeners()返回添加到此ActionListeners的所有JButton的数组。

07-26 09:29