Как отключить eventListener в RCP? - PullRequest
1 голос
/ 17 мая 2011

У меня есть EventListener, выделенный для прослушивания события focusLost () Text в моем представлении в Eclipse RCP. Слушатель работает нормально. Но в какой-то момент выполнения я хочу отключить прослушиватель от прослушивания текста, а позже я хочу, чтобы он был активирован. Как его можно деактивировать или активировать в соответствии с нашими потребностями программно?

Ответы [ 2 ]

3 голосов
/ 17 мая 2011

Вы можете использовать removeListener() метод SWT Widget .Для этого вам понадобится ссылка на Listener.
Эту ссылку можно получить, используя метод getListeners(int eventType).
Типы событий определены как константы в SWT-классе .Это может выглядеть так, я не уверен насчет фактического типа события, хотя

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();
} 

Действие под капотом хорошо описано в ответе Пола Вебстера.

0 голосов
/ 17 мая 2011

Другим распространенным шаблоном является включение логического значения в прослушиватель (или связанное с текстовым полем).Хотя, вероятно, не слишком дорого для одного виджета, добавление и удаление прослушивателей потенциально требует копирования и выделения массива.Просто установите включен в false:

public final void handleEvent(final Event event) {
    if (!textListenerEnabled) {
        return;
    }
    // the rest of your processing.
}
...