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