Как вы используете GWT SimpleEventBus или EventBus?
Я работаю над разработкой некоторого простого графического программного обеспечения, которое должно быть реализовано как в Swing, так и в GWT. Что касается gwt, я собираюсь использовать gwt-g2d для холста. Я надеялся использовать шину событий в обеих реализациях, чтобы упростить некоторые программы.
Насколько я понимаю, это должно быть что-то вроде этого:
- Создание EventBus
- Создание родительского виджета, приемник событий, которые вы хотите для EventBus (например, при наведении мыши или обратном вызове rpc)
- Установите EventBus для прослушивания событий из родительского виджета.
- Создайте дочерние виджеты, которые должны регистрироваться в EventBus у слушателей, которых он имеет (им нужно регистрировать события, которые они могут запускать?)
- Когда EventBus получает событие, он должен принять решение о событии и затем принять решение, независимо от того, означает ли это его игнорирование, изменение типа события или просто передачу его всем применимым дочерним виджетам.
Это вообще как должно работать? SimpleEventBus все еще своего рода новый, и я не могу найти много в Интернете о том, как действительно использовать его.
2 ответа
SimpleEventBus предоставляет базовую функциональность для хранения коллекции обработчиков и вызова event.dispatch() со всеми соответствующими обработчиками, когда это необходимо. Я бы не сказал, что вы "устанавливаете EventBus для прослушивания событий" из родительского виджета. SimpleEventBus не имеет понятия "родитель". Вместо этого вы передаете ссылку на ваш SimpleEventBus. Затем любой объект может "инициировать событие" с помощью метода SimpleEventBus.fireEvent. Там нет иерархии.
Точно так же любой объект может прослушивать эти события с помощью SimpleEventBus.addHandler(). Это ближе всего к вашему #4 - addHandler принимает тип события и обработчик, поэтому всякий раз, когда этот тип события передается fireEvent
(чем-то в вашем приложении), этот обработчик будет передан событию. Обратите внимание, что Event
это то, что вызывает обработчик, а не EventBus! EventBus просто вызывает event.dispatch(theHandler), и программист события отвечает за вызов соответствующей функции в theHandler. Ваш #5 неточен, по крайней мере для SimpleEventBus - SimpleEventBus вообще не проверяет события, кроме как посмотреть, какие обработчики вызывать. Он не знает ни о дочерних виджетах, ни о какой-либо логике приложения и никогда не меняет тип события.
Ваша логика о том, какой регион был выбран, не будет подходящей в EventBus - вместо этого вы создадите обработчик, который выполняет логику и прослушивает ClickEvents. Затем этот обработчик может сообщить выбранному региону, что он был выбран напрямую, или вы можете создать свой собственный RegionSelectionEvent, который вы можете запустить вдоль EventBus, и тогда все регионы могут быть проинформированы о том, что произошло RegionSelection, и ваш регистратор может получить уведомление или монитор вашего сервера может получить уведомление и уведомить начальника о том, что кто-то выбрал регион или что-то еще. Если вам просто нужно отменить выбор одного региона и выбрать другой, шина событий является излишней.
С другой стороны, что-то вроде события "resize" имеет большой смысл, так как все ваши виджеты, возможно, должны знать об этом.
Насколько я понимаю GWT EventBus, он предназначен для событий, относящихся ко всему приложению (подумайте "общесистемный объект x измененное свойство y"; все, что слушает это конкретное событие, может воздействовать на него). Это поможет вам отделить логику вашего приложения.
Вы, вероятно, не хотите запускать какие-либо события пользовательского интерфейса в него: ваши родительские виджеты могут реализовывать обработчики или вы можете просто использовать анонимные экземпляры.