我遇到一种情况,其中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
的数组。