Демультиплекс / делегат для системы событий GWT, используя перечисления - PullRequest
0 голосов
/ 06 декабря 2011

У меня есть перечисление, скажем Fruits {Apple, Banana, Cherry}. Я хочу написать подсистему событий для своего приложения, чтобы у меня был следующий шаблон:

class AppleListener implements HasFruitPriceChangeListener<Apple> {
    onFruitPriceChange(int newPrice) { 
        // do stuff
    }
}

и один слушатель, который может делегировать задачи в следующем формате:

class FruitPriceListener {
     public void onPriceChange(EnumMap<Fruits, Integer> pricePoints) {
         // for each fruit, throw the event as
         // FruitPriceChange.fire(Apple, newPrice);
     }
}

Есть ли способ сделать это описанным выше способом? Я, вероятно, хотел бы использовать ValueChangeEvent, но создание еще одного события и обработчика тоже хорошо. Чего я не хочу делать, так это иметь определения событий / классов для каждого элемента, например, AppleFruitPriceChangeEvent и т. Д.

Ответы [ 2 ]

1 голос
/ 06 декабря 2011

Вы можете использовать EventBus для этого, что предложил Google (http://www.youtube.com/watch?v=PDuhR18-EdM). Как его использовать.

Ваш глобальный Eventbus

public static SimpleEventBusbus = new SimpleEventBus ();

Ваше событие изменения:

import com.google.gwt.event.shared.GwtEvent;

import eyeweb.client.gwtMessages.JSPollingEntry;

public class EventModified extends GwtEvent<EventModifiedHandler> {

    public final static Type<EventModifiedHandler> TYPE = new Type<EventModifiedHandler>();

    private final Fruits fruits;
    public final JSPollingEntry getPollingMessage(){
        return fruits;
    }

    public EventModified(Fruits fruits) {
        this.fruits = fruits;
    }

    @Override
    public com.google.gwt.event.shared.GwtEvent.Type<EventModifiedHandler> getAssociatedType() {
        return TYPE;
    }

    @Override
    protected void dispatch(EventModifiedHandler handler) {
        handler.onUpdateRecivde(this);
    }
}

обработчик события

package eyeweb.client.eventbus;

import com.google.gwt.event.shared.EventHandler;

public interface EventModifiedHandler extends EventHandler {

    public void onUpdateRecivde(EventModified handler);
}

Событие, когда что-то меняется

EventBus.bus.fireEvent(new EventModified(fruite));

и обработчик, который получает событие

EventBus.bus.addHandler(EventModified .TYPE, new EventModifiedHandler() {
            @Override
            public void onMessageSend(EventSendData e) {
                //... do stuff          }
        });

Ну, это должно быть все;)

С уважением, Стефан

0 голосов
/ 05 января 2012

Итак, решение, которое я придумал, было:

  1. Создайте перечисление и свяжите с ним GwtEvent.Type:

    enum Fruits {
      Apple, Banana, Cherry;
    
      public GwtEvent.Type getGwtEventType() {
        return new GwtEvent.Type();
      }
    }
    
  2. Создайте новое событие.

    class FruitPriceChangeEvent extends GwtEvent<?> {
    
      private final Fruit fruit;
      FruitPriceChangeEvent(Fruit fruitEnum) {
        this.fruit = fruitEnum;
      }
    
      @Override
      public GwtEvent.Type<?> getAssociatedType() {
        return fruit.getGwtEventType();
      }
    
      // ... other stuff...
    
    }
    

И затем пропустите его через весь цикл обработчика событий, как упомянул @Stefan.Преимущество этого подхода в том, что SimpleEventBus поддерживает HashMap<GwtEvent.Type, List<HasHandlers>>, из которого можно получить события, и каждый раз, когда вы создаете новый GwtEvent.Type, он генерирует уникальный хэш-код (подробнее см. В реализации).

Ссылки:

http://grepcode.com/file/repo1.maven.org/maven2/com.google.gwt/gwt-servlet/2.1.1-rc1/com/google/gwt/event/shared/GwtEvent.java?av=f

http://grepcode.com/file/repo1.maven.org/maven2/com.google.gwt/gwt-servlet/2.1.1-rc1/com/google/gwt/event/shared/SimpleEventBus.java?av=f

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...