Как отличить пользовательские события от синтетических?

StackOverflow https://stackoverflow.com/questions/488190

Вопрос

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

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

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

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

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

Это было полезно?

Решение

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

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

Другие советы

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

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

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

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top