2011-12-06 39 views
0

我有一個枚舉,例如Fruits {Apple,Banana,Cherry}。我想寫一個事件子系統爲我的應用程序,這樣我可以有以下模式:GWT事件系統的解複用/代理,使用枚舉

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,但創建另一個1事件和處理程序也很好。我不想做的是每個項目都有事件/類定義,比如AppleFruitPriceChangeEvent等等。

回答

0

於是我想出了一個解決辦法是:

  1. 創建枚舉,和準一GwtEvent.Type與他們:

    enum Fruits { 
        Apple, Banana, Cherry; 
    
        public GwtEvent.Type getGwtEventType() { 
        return new GwtEvent.Type(); 
        } 
    } 
    
  2. Crea一個新的事件。

    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

1

你可以使用EventBus這個東西,其中谷歌建議(http://www.youtube.com/watch?v=PDuhR18-EdM)這裏如何使用它。

你globl Eventbus

公共靜態SimpleEventBus總線=新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

斯特凡嗨,我發現後不久,做到這一點,所以從來沒有檢查這個問題本身。我很快就會發布我的解決方案。 – Arindam