2011-08-01 10 views
6

Necesito escribir un ValueChangeHandler personalizado y llamar al onValueChange(ValueChangeEvent). Sin embargo, no entiendo cómo escribir un ValueChangeEvent.Custom ValueChangeHandler GWT

Quizás entiendo todo el sistema de eventos GWT mal. ¿Alguien puede ayudar?

Edit: Pregunto cómo crear mi propia clase que distribuye el ValueChangeEvent. Entiendo cómo escucharlo.

El constructor de ValueChangeEvent no está visible y no puedo crearlo.

Respuesta

15

Si desea disparar un ValueChangeEvent debe implementar la interfaz HasValueChangeHandlers por o su clase o en algún lugar de la clase.

Una aplicación sencilla sería la de utilizar el 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); 
} 

en cuenta que necesita sustituir T con el tipo que desee para disparar.

Porque no se puede crear un ValueChangeEvent despachar directamente un evento se realiza mediante el método de incendios:

ValueChangeEvent.fire(this, value); 

Dónde this se refiere a la clase/campo de aplicación de la HasValueChangeHandlers y value se refiere al valor que ha sido cambiado y desea enviar el evento.

+0

Gracias, tengo todo lo demás para trabajar por ahora pero no sabía sobre el EventBut. –

+0

@Hilibrand - Oye, tengo que hacer esto exactamente otra vez en GWT 2.0.4 que no tiene EventBus. No puedo encontrar ninguna referencia. ¿Sabe cómo se hace? –

+0

Para GWT 2.0.4 puede usar la clase 'com.google.gwt.event.shared.HandlerManager'. Puede inicializarlo con la clase actual: 'nuevo HandlerManager (esto);' –

0

GWT genera el ValueChangeEvent. Puede agregar uno (o más) ValueChangeHandler a cualquier clase que implemente la interfaz HasValueChangeHandlers. Una de estas clases es TextArea, por lo que vamos a ver un pequeño ejemplo:

TextArea textArea = new TextArea(); 

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

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

Cuando el valor de los cambios en el área de texto, GWT generará automáticamente un ValueChangeEvent, que se puede utilizar en la parte I marcados con "hacer alguna cosa".

+0

No lo necesito. Estoy creando mi propia "Área de texto" y necesito que envíe un ValueChangeEvent al igual que lo hace TextArea. –

+0

Ok, su pregunta sugería que quería saber cómo escribir un ValueChangeHandler (en lugar de una implementación de HasValueChangeHandlers) :-) –

+0

Sí, lo siento por la pregunta engañosa. El inglés no es mi lengua materna :(. –

1

muy tarde para contestar, pero he acabamos de resolver este problema como este:

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

En realidad, en lugar de crear una nueva EventBus o HandlerManager, como el widget será una subclase de Wiget, que la la forma estándar sería usar el método Widget.addHandler (handler, eventType). Aquí hay un ejemplo mínimo:

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

La clase solo necesita implementar la interfaz HasValue . – Alicia