Как отличить пользовательские события от синтетических событий? - PullRequest
1 голос
/ 28 января 2009

У меня есть редактор JFace, который в основном состоит из TreeViewer. Это подключено к ContentOutlinePage, чтобы оживить представление Outline.

Когда один из них получает SelectionChangedEvent, он вызывает метод setSelection() другого ... и в этом заключается проблема. setSelection() генерирует еще один SelectionChangedEvent ... и, таким образом, бесконечный цикл объединяется.

Есть ли способ сообщить, был ли SelectionChangedEvent создан фактическим взаимодействием с пользователем, а не другим объектом, вызывающим setSelection()?

Есть ли еще лучший способ остановить смертельные объятия?

Подсказки приветствуются.

Ответы [ 2 ]

3 голосов
/ 28 января 2009

Как правило, вы должны проверить флаг в начале процедуры, чтобы проверить, находитесь ли вы в середине обработчика событий. Если флаг установлен, то вы выходите без обработки.

Если флаг не установлен, вы устанавливаете флаг, обрабатываете, затем устанавливаете флаг обратно.

0 голосов
/ 13 февраля 2009

Другой шаблон, который работает, - это удалить прослушиватель событий, сделать выбор, снова добавить список событий. Это гарантирует, что в коде есть единственное место, где вам нужно об этом беспокоиться - с флагом вам придется одновременно поддерживать два места.

Кроме того, SelectionChangedChanged возможно (хотя и не уверен) помещается поверх стека событий (т.е. выполняется асинхронно). В этом случае вы также минимизируете период, в течение которого зритель не распространяет уведомление.

В целом меня разочаровывает то, что сгенерированное SelectionChangedEvent одинаково, независимо от того, была ли нажата мышь. Я полагаю, это сделать не так легко, как хотелось бы. Однажды мне пришлось изменить поведение класса текстового редактора, чтобы он в новинку касался двух видов событий вставки (сгенерированных пользователем и сгенерированных сетью), чтобы сделать этот класс текстовым редактором общим. Я хотел бы видеть больше обсуждения этого.

...