Пользовательский обработчик событий GWT - PullRequest
43 голосов
/ 16 июня 2009

Может ли кто-нибудь дать мне пример создания пользовательского набора события и обработчика. Скажем, у вас есть объект Person, о котором ваши виджеты должны знать, если он обновился.

Вы создаете HandlerManager, и теперь вам нужно создать событие и обработчик. Как бы вы определили эти классы, чтобы можно было подписываться и запускать события?

Большинство событий основаны на DOM, хотя я хочу создать некоторые пользовательские события и обработчики, которые я могу запускать вне любого события на основе браузера.

Ответы [ 8 ]

31 голосов
/ 21 июня 2009

Спасибо за все ответы. Закнесс подошел ближе всего, чтобы дать мне ответ, который мне был нужен, однако я придумал немного более простую модель.

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

После просмотра Архитектуры Google Web Toolkit: лучшие практики для разработки вашего приложения GWT видео из Google IO идея шины событий казалась идеальной.

Я опубликую свое решение здесь на случай, если оно кому-нибудь поможет.


Сначала создайте класс 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); 
    }

}
23 голосов
/ 19 июня 2009

Вот довольно полный пример создания пользовательского события, дословно взятый из 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);
    };
   ...
}
4 голосов
/ 15 июля 2009

Вот пример этого в блоге Алекса Рида, включая ссылку на пример операционного кода . Пример заполняет некоторые нечеткие фрагменты и, наряду с приведенным здесь примером Ника, помогает прояснить начало работы с созданием шины событий в вашем приложении gwt.

2 голосов
/ 28 мая 2010

Я думаю, что наиболее полный и подробный пример есть в этой статье

Он также содержит пример проекта, который показывает, как правильно использовать определение пользовательских событий и использовать класс HandlerManager GWT.

1 голос
/ 24 мая 2011

Еще один комментарий: если вы попытаетесь сделать что-то похожее, чтобы отреагировать в основном приложении на событие, вызванное пользовательским компонентом графического интерфейса (например, составной и т. Д.), Я думаю, что вы должны явно подключить основное приложение для обработки событие компонента:

yourComponent.addHandler(this, YourEvent.TYPE);

где "this" - это класс, который реализует ваш пользовательский интерфейс обработчика.

1 голос
/ 31 января 2010

Создание пользовательских событий GWT с использованием HandlerManger не должно быть таким сложным, посмотрите на пример GwtEventBus @ NingZhang.info это действительно интуитивно понятно Ключевые используемые классы:

  • com.google.gwt.event.shared.HandlerManager
  • com.google.gwt.event.shared.GwtEvent
  • com.google.gwt.event.shared.EventHandler
0 голосов
/ 17 июня 2009

Возможно, вы захотите взглянуть на ValueChangeHandler и ValueChangeEvent в GWT 1.6. Это может сработать для того, что вы пытаетесь сделать.

0 голосов
/ 16 июня 2009

Звучит так, как будто вам нужна поддержка PropertyChange *. Посмотрите на gwtx . Google 'gwt PropertyChange' и вы получите несколько блогов, которые объясняют, как его использовать.

...