Может кто-то давать мне пример создания пользовательского набора События и Обработчика. Скажите, что Вы сделали, чтобы Человек возразил, что Вы хотите, чтобы Ваши виджеты знали, было ли это обновлено.
Вы создаете HandlerManager, и теперь необходимо создать Событие и Обработчик. Как Вы определили бы те классы так, чтобы можно было подписать и запустить события?
Большинство Событий является базирующимся DOM, в то время как я хочу создать некоторые пользовательские события и обработчики, которые я могу запустить за пределами любого события на базе браузера.
Вот довольно подробный пример создания настраиваемого события, дословно взятый из 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;
}
...
}
Подключите метод fire обработчика
class HappyEvent extends GwtEvent {
static Key<HappyEvent,HappyHandler> KEY = new Key<HappyEvent,HappyHandler>(){
protected void fire(HappyHandler handler, HappyEvent event) {
handler.onHappiness(event);
};
...
}
Похоже, вам нужна поддержка PropertyChange *. Взгляните на gwtx . Погуглите "gwt PropertyChange", и вы получите несколько блогов, в которых объясняется, как его использовать.
Возможно, вы захотите взглянуть на ValueChangeHandler и ValueChangeEvent в GWT 1.6. Они могут сработать для того, что вы пытаетесь сделать.
Спасибо за все ответы. Закнесс подошел ближе всего к тому, чтобы дать мне нужный ответ, однако я придумал немного более простую модель.
Моей основной целью было избежать использования статической переменной в моей основной структуре данных. Я также столкнулся с проблемой, пытаясь выяснить, была ли эта основная структура данных успешно извлечена из базы данных во время попытки доступа к ней, и что делать, если это не так (т.е. когда она пуста).
После просмотра Google Web Toolkit Architecture: Best Practices For Architecting Your GWT App видео от Google IO, идея шины событий казалась идеальной.
I ' Я опубликую здесь свое решение на случай, если оно поможет кому-то еще.
Сначала создайте класс 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);
}
}
Вот пример этого в блоге Алекса Рида, включая ссылку на пример рабочего кода . Этот пример заполняет некоторые нечеткие части и, наряду с примером Ника, помогает прояснить начало работы с архитектурой шины событий в вашем приложении gwt.