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); 
    }

}

Ответ 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. Они могут работать для того, что вы пытаетесь сделать.