2011-08-01 99 views
6

我需要編寫自定義ValueChangeHandler並呼叫onValueChange(ValueChangeEvent)。但我不明白如何寫一個ValueChangeEvent自定義ValueChangeHandler GWT

也許我理解整個GWT事件系統是錯誤的。誰能幫忙?

編輯:我在問如何創建我自己的派發ValueChangeEvent的類。我明白如何聽它。

ValueChangeEvent的構造函數不可見,我無法創建它。

回答

15

如果你想發射一個ValueChangeEvent你必須實現接口HasValueChangeHandlers或你的類或類中的某個地方。

簡單的執行是使用EventBus:

EventBus bus = new SimpleEventBus(); 

@Override 
public void fireEvent(GwtEvent<?> event) { 
    bus.fireEvent(event); 
} 

@Override 
public HandlerRegistration addValueChangeHandler(ValueChangeHandler<T> handler) { 
    return bus.addHandler(ValueChangeEvent.getType(), handler); 
} 

注意你需要替換T你想火的類型。

因爲你無法創建ValueChangeEvent直接分派事件,通過火法完成:

ValueChangeEvent.fire(this, value); 

this是指實施HasValueChangeHandlersvalue類/場是指已經值改變並且你想分派事件。

+0

謝謝,我現在有一切工作,但我不知道與EventBut緊密相關。 –

+0

@Hilibrand - 嘿,我需要在GWT 2.0.4中再次做到這一點。沒有EventBus,我找不到任何參考,你知道它是如何完成的嗎 –

+0

對於GWT 2.0.4,你可以使用'com.google.gwt.event.shared.HandlerManager'類,你可以初始化它與當前類:'new HandlerManager(this);' –

0

ValueChangeEvent是由GWT爲您生成的。您可以將一個(或多個)ValueChangeHandler添加到實現接口HasValueChangeHandlers的任何類。其中一個班是TextArea,讓我們看一個小例子:

TextArea textArea = new TextArea(); 

    textArea.addValueChangeHandler(new ValueChangeHandler<String>() { 

     @Override 
     public void onValueChange(ValueChangeEvent<String> event) { 
      // do something 
     } 
    }); 

當文本區域的值發生變化,GWT會自動生成一個ValueChangeEvent,您可以在我打上了部分使用「do東西」。

+0

我不需要那樣。我正在創建自己的「TextArea」,我需要像TextArea那樣分派ValueChangeEvent。 –

+0

好的,你的問題表明你想知道如何編寫一個ValueChangeHandler(而不是HasValueChangeHandlers實現):-) –

+0

是的,抱歉的誤導性問題。英語不是我的本地語言:(。 –

1

真的來不及回答,但我剛剛解決了這個問題是這樣的:

ValueChangeEvent.fire(hasValueChangeHandlerInstance, getValue()); 
11

事實上,而不是創建一個新的EventBus或HandlerManager,因爲你的widget將Wiget的子類,它的標準的方法是使用Widget.addHandler(handler,eventType)方法。這是一個最小的例子:

public class MyWidget<T> extends Composite implements HasValueChangeHandlers<T>, HasValue<T> { 

    private T value; 

    public MyWidget() { 
     // Initialize stuff 
    } 

    @Override 
    public HandlerRegistration addValueChangeHandler(final ValueChangeHandler<T> handler) { 
     return addHandler(handler, ValueChangeEvent.getType()); 
    } 

    @Override 
    public T getValue() { 
     return value; 
    } 

    @Override 
    public void setValue(T value) { 
     setValue(value, false); 
    } 

    @Override 
    public void setValue(T value, boolean fireEvents) { 
     this.value = value; 
     if (fireEvents) { 
      ValueChangeEvent.fire(this, getValue()); 
     } 
    } 
} 
+0

該類僅需實現HasValue 接口。 – Alicia