如何在RCP中禁用eventListener?

时间:2011-05-17 10:18:49

标签: eclipse listener rcp

我有一个EventListener专门用于在Eclipse RCP的视图中监听Text的focusLost()事件。听众的工作正常。但是在执行的某个时刻我想要从Listening to Text和Later中禁用这个Listener我希望它被激活。 如何根据我们的需要以编程方式停用或激活它?

2 个答案:

答案 0 :(得分:3)

您可以使用SWT WidgetremoveListener()方法。您需要引用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.
}