GWT Custom Event Handler
Может ли кто-нибудь дать мне пример создания настраиваемого набора событий и обработчика.
Скажем, у вас есть объект Person, который вы хотите, чтобы ваши виджеты узнали, обновлен ли он.
Создается HandlerManager, и теперь вам нужно создать событие и обработчик.
Как бы вы определили эти классы, чтобы вы могли подписаться и активировать события?
Большинство событий основаны на DOM, в то время как я хочу создать некоторые настраиваемые события и обработчики, которые я могу запустить за пределами любого события на основе браузера.
Ответы
Ответ 1
Здесь представлен довольно подробный пример создания настраиваемого события, взятого стенографически из GwtEventSystem Wiki (когда система событий все еще находилась в инкубаторе GWT).
Это событие, которое запускается, когда пользователь становится счастливым.
Определите новый класс событий. Вы можете добавить произвольные метаданные в класс события. Для простоты здесь мы не будем включать здесь.
public class HappyEvent extends GwtEvent {
...
}
Определите новый интерфейс обработчика и маркера для класса событий.
interface HappyHandler extends EventHandler {
public void onHappiness(HappyEvent event);
}
interface HasHappyEvents {
public HandlerRegistration addHappyHandler(HappyHandler handler);
}
Добавить уникальный тип события
class HappyEvent extends AbstractEvent{
public static AbstractEvent.Key KEY = new AbstractEvent.Key(){...}
public GwtEvent.Key getKey(){
return KEY;
}
...
}
Подключите метод пожарного обработчика
class HappyEvent extends GwtEvent {
static Key<HappyEvent,HappyHandler> KEY = new Key<HappyEvent,HappyHandler>(){
protected void fire(HappyHandler handler, HappyEvent event) {
handler.onHappiness(event);
};
...
}
Ответ 2
Спасибо за все ответы. Закнес подошел ближе всего, чтобы дать мне ответ, который мне нужен, однако я придумал немного более простую модель.
Моя основная цель состояла в том, чтобы избежать использования статической переменной в моей основной структуре данных. Я также столкнулся с проблемой попыток выяснить, была ли эта основная структура данных успешно извлечена из базы данных во время попытки доступа к ней и что делать, когда она отсутствует (т.е. Когда она равна нулю).
После просмотра Google Web Toolkit Architecture: Лучшие практики для архивирования вашего приложения GWT из Google IO идея Event Bus показалась идеальной.
Я отправлю свое решение здесь, если это поможет кому-то еще.
Сначала создайте класс Handler. Обратите внимание на ссылку на класс Event:
public interface CategoryChangeHandler extends EventHandler {
void onCategoryChange(CategoryChangeEvent event);
}
Теперь к классу Event. Это дало мне большую неприятность:
public class CategoryChangeEvent extends GwtEvent<CategoryChangeHandler> {
private final List<Category> category;
public CategoryChangeEvent(List<Category> category) {
super();
this.category = category;
}
public static final Type<CategoryChangeHandler> TYPE = new Type<CategoryChangeHandler>();
@Override
protected void dispatch(CategoryChangeHandler handler) {
handler.onCategoryChange(this);
}
@Override
public com.google.gwt.event.shared.GwtEvent.Type<CategoryChangeHandler> getAssociatedType() {
return TYPE;
}
public List<Category> getCategories(){
return category;
}
}
Теперь я могу использовать эти классы Handler и Event, например, когда эта основная структура данных перезагружается:
Этот код получил структуру данных и хочет уведомить всех, кто слушает, что он обновлен:
CategoryChangeEvent event = new CategoryChangeEvent(result);
eventBus.fireEvent(event);
Этот код представляет собой реализацию события
public class PopulateCategoryHandler implements CategoryChangeHandler {
@Override
public void onCategoryChange(CategoryChangeEvent event) {
tearDownCategories();
List<Category> categories = event.getCategories();
populateCategories(categories);
}
}
Ответ 3
Вот пример этого в блоге Alex Reid, включая ссылку на пример рабочего кода. Пример заполняет некоторые из нечетких битов и, наряду с примером Ник здесь, помогает прояснить начало работы с архитектурой шины событий в вашем приложении gwt.
Ответ 4
Я думаю, что наиболее полный и подробный пример представлен в в этой статье
Он также содержит пример проекта, который показывает, как правильно использовать определенные пользовательские события и использовать класс GWT HandlerManager.
Ответ 5
Создавать пользовательские события GWT с помощью HandlerManger не должно быть так сложно, посмотрите на пример GwtEventBus @NingZhang.info, это реальный интуитивный. Ключевыми классами являются:
- com.google.gwt.event.shared.HandlerManager
- com.google.gwt.event.shared.GwtEvent
- com.google.gwt.event.shared.EventHandler
Ответ 6
Еще один комментарий: если вы попытаетесь сделать что-то похожее на реакцию в основном приложении на событие, выпущенное из пользовательского компонента графического интерфейса (например, композитного и т.д.), я думаю, что вам необходимо напрямую подключить основное приложение для обработки событие компонента:
yourComponent.addHandler(this, YourEvent.TYPE);
где "this" - это класс, который реализует ваш пользовательский интерфейс обработчика.
Ответ 7
Похоже, вы хотите поддержку PropertyChange *. Посмотрите gwtx. Google 'gwt PropertyChange', и вы получите несколько блогов, которые объяснят, как их использовать.
Ответ 8
Возможно, вам стоит взглянуть на ValueChangeHandler и ValueChangeEvent в GWT 1.6. Они могут работать для того, что вы пытаетесь сделать.