我有一个EventListener专门用于在Eclipse RCP的视图中监听Text的focusLost()事件。听众的工作正常。但是在执行的某个时刻我想要从Listening to Text和Later中禁用这个Listener我希望它被激活。 如何根据我们的需要以编程方式停用或激活它?
答案 0 :(得分:3)
您可以使用SWT Widget的removeListener()
方法。您需要引用Listener
才能执行此操作。
可以使用getListeners(int eventType)
方法获得此引用。
事件类型在SWT class中定义为常量。它可能看起来像这样,我不确定实际的事件类型,但
Listener[] focusOutListeners = myWidget.getListeners(SWT.FocusOut);
for(int i = 0 ; i< focusOutListeners; i++){
myWidget.removeListener(SWT.FocusOut, focusOutListeners[i]);
}
// ... do stuff the listeners will not know about ...//
for(int i = 0 ; i< focusOutListeners; i++){
myWidget.addListener(SWT.FocusOut, focusOutListeners[i]);
}
AFAIK在SWT中没有其他方法可以禁用Listener
,但是当您的Listener
只实现相应的接口时,您可以实现自定义的禁用/启用方法。然后你的代码看起来像这样:
Listener [] focusOutListeners = myWidget.getListeners(SWT.FocusOut);
for(int i = 0 ; i< focusOutListeners; i++){
CustomListener listener = (CustomListener)focusOutListeners[i]);
listener.disable();
}
// ... do stuff the listeners will not know about ...//
for(int i = 0 ; i< focusOutListeners; i++){
CustomListener listener = (CustomListener)focusOutListeners[i]);
listener.enable();
}
Paul Webster的回答很好地描述了引擎盖下的行为。
答案 1 :(得分:0)
使用的另一种常见模式是在侦听器中包含一个布尔值(或与文本字段关联)。虽然在单个小部件上可能不会太昂贵,但添加和删除侦听器可能涉及阵列副本和分配。只需将enabled设置为false:
public final void handleEvent(final Event event) {
if (!textListenerEnabled) {
return;
}
// the rest of your processing.
}