使用空赋值来控​​制侦听器的添加和删除

时间:2012-01-04 02:42:06

标签: java null actionlistener

我有一种情况,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;
    }
  }
}

2 个答案:

答案 0 :(得分:2)

每次都不要实例化和处理侦听器对象。使用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的数组。

答案 1 :(得分:2)

是否绝对有必要从组件中不断添加和删除侦听器?您是否可以禁用该组件,或者使用一个标志来确定是否可以运行该操作?

您可以将侦听器包装在您定义的另一个侦听器中吗?包络监听器可以有一个布尔开关,你可以翻转来控制对真实监听器的委托。

如果情况变得更糟,你绝对必须删除并添加监听器,你可以按照以下方式进行操作:AVD的解决方案:

public void setListener() {
    // java.util.List and java.util.Arrays
    List<ActionListeners> listenerList = Arrays.asList(fComponent.getActionListeners());

    if (!listenerList.contains(fListener) {
        fComponent.addActionListener(fListener);
    }
}

public void removeListener() {
    List<ActionListeners> listenerList = Arrays.asList(fComponent.getActionListeners());

    if (listenerList.contains(fListener) {
        fComponent.removeActionListener(fListener);
    }
}