使用枚举对GWT事件系统进行解复用/委托

时间:2011-12-06 09:51:23

标签: events gwt event-handling

我有一个枚举,说水果{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 个答案:

答案 0 :(得分:1)

你可以使用EventBus来解决这个问题,谷歌建议(http://www.youtube.com/watch?v=PDuhR18-EdM)这里有如何使用它。

您的globl Eventbus

  

public static SimpleEventBus bus = 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          }
        });

那可能就是全部;)

此致 斯蒂芬

答案 1 :(得分:0)

所以我提出的解决方案是:

  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...
    
    }
    
  3. 然后将其传递给整个事件处理程序循环,如@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