#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. Спасибо, Пол, за ответ. Ваша идея также великолепна и изумительна.