我有一个枚举,说水果{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,等等。
答案 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)
所以我提出的解决方案是:
创建枚举,并将GwtEvent.Type与它们相关联:
enum Fruits {
Apple, Banana, Cherry;
public GwtEvent.Type getGwtEventType() {
return new GwtEvent.Type();
}
}
创建新活动。
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
时,它都会生成一个唯一的哈希码(请查看实现以获取更多详细信息)。
参考文献: