2011-08-01 10 views
6

Özel bir ValueChangeHandler yazıp onValueChange(ValueChangeEvent) numaralı telefonu çağırmalıyım. Ancak, bir ValueChangeEvent yazmayı anlamıyorum.Özel ValueChangeHandler GWT

Belki tüm GWT olay sistemini yanlış anlıyorum. Biri yardım edebilir mi?

Düzenleme: Kendi sınıfımı nasıl oluşturacağımı soruyorum, ValueChangeEvent öğesini gönderir. Onu nasıl dinleyeceğimi anlıyorum.

ValueChangeEvent yapıcısı görünür değil ve oluşturamıyorum.

cevap

15

ValueChangeEvent'u çalıştırmak istiyorsanız, sınıfınız veya sınıfta bir yerde HasValueChangeHandlers arayüzünü uygulamalısınız. Eğer tetiklenmesini istediğiniz tip T yerine gerekecektir

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); 
} 

Not:

Basit uygulama EventBus kullanmak olacaktır.

doğrudan ateş yöntemi ile yapılır, bir olayı gönderilerek ValueChangeEvent oluşturamazsınız Çünkü: thisHasValueChangeHandlers ve value uygulayan sınıf/alana karşılık gelir

ValueChangeEvent.fire(this, value); 

olmuştur değeri ifade eder değişti ve olayı göndermek istiyorsun.

+0

Teşekkürler, şimdiye kadar çalışacak başka her şeyim var ama EventBut'u bilemedim. –

+0

@Hilibrand - Hey, bu şeyi tekrar GWT 2.0.4'te yapmam gerekiyor. EventBus'unuz yok.Benim için herhangi bir başvuru bulamıyorum.Bunun nasıl yapıldığını biliyor musunuz? –

+0

GWT 2.0.4 için 'com.google.gwt.event.shared.HandlerManager' sınıfını kullanabilirsiniz. Şu anki sınıfa sahip: 'yeni HandlerManager (bu);' –

0

ValueChangeEvent, GWT tarafından sizin için üretilmiştir. HasValueChangeHandlers arabirimini uygulayan herhangi bir sınıfa bir (veya daha fazla) ValueChangeHandler ekleyebilirsiniz. Bu sınıflardan biri TextArea, bu nedenle en küçük bir örneğe bakalım: Metin alanı değeri değiştiğinde, GWT otomatik ben işaretli kısmında kullanabileceğiniz bir ValueChangeEvent, üretecektir zaman

TextArea textArea = new TextArea(); 

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

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

"do şey".

+0

Buna ihtiyacım yok. Kendi "TextArea" yaratıyorum ve TextArea'nın yaptığı gibi bir ValueChangeEvent göndermek için buna ihtiyacım var. –

+0

Tamam, sorunuz bir ValueChangeHandler (HasValueChangeHandlers uygulamasının aksine) yazmayı öğrenmek istediğinizi önerdi :-) –

+0

Evet, yanıltıcı soru için özür dilerim. İngilizce benim ana dilim değil :(. –

1

cevap Gerçekten geç, ama sadece böyle bu sorunu çözdük: Widget Wiget bir alt sınıf olacak şekilde, yerine yeni EventBus veya HandlerManager yaratma, Aslında

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

o standart yol Widget.addHandler (handler, eventType) yöntemini kullanmak olacaktır. İşte en az bir örnek:

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

Sınıfın sadece HasValue arayüzünü uygulaması gerekiyor. – Alicia