Как отключить EventListener в RCP?

#eclipse #listener #rcp

#eclipse #прослушиватель #rcp

Вопрос:

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

Ответ №1:

Вы можете использовать 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 просто реализует соответствующий интерфейс, вы можете реализовать пользовательские методы отключения / включения. Тогда ваш код мог бы выглядеть следующим образом:
Прослушиватель [] 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();
} 
  

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

Комментарии:

1. Спасибо, Костя, за твой ответ. Не могли бы вы, пожалуйста, показать мне пример, как сделать ссылку на прослушиватель?

2. костя, большое тебе спасибо. наконец-то я понял, в чем дело. Еще раз спасибо

Ответ №2:

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

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

Комментарии:

1. Спасибо, Пол, за ответ. Ваша идея также великолепна и изумительна.