我需要编写自定义ValueChangeHandler
并调出onValueChange(ValueChangeEvent)
。但是我不明白如何写ValueChangeEvent
。
也许我理解整个GWT事件系统是错误的。有人可以帮忙吗?
编辑:我在问我如何创建自己的调度ValueChangeEvent的类。我理解如何倾听它。
ValueChangeEvent的构造函数不可见,我无法创建它。
答案 0 :(得分: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
替换为您要触发的类型。
因为您无法直接通过fire方法创建ValueChangeEvent调度事件:
ValueChangeEvent.fire(this, value);
this
指的是实现HasValueChangeHandlers
的类/字段,而value
指的是已更改的值,您希望调度该事件。
答案 1 :(得分:11)
实际上,由于您的窗口小部件将是Wiget的子类,而不是创建新的EventBus或HandlerManager,标准方法是使用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());
}
}
}
答案 2 :(得分:1)
回答真的很晚,但我刚刚解决了这个问题:
ValueChangeEvent.fire(hasValueChangeHandlerInstance, getValue());
答案 3 :(得分:0)
GWT为您生成ValueChangeEvent
。您可以向实现接口ValueChangeHandler
的任何类添加一个(或多个)HasValueChangeHandlers
。其中一个类是TextArea
,所以让我们看一个小例子:
TextArea textArea = new TextArea();
textArea.addValueChangeHandler(new ValueChangeHandler<String>() {
@Override
public void onValueChange(ValueChangeEvent<String> event) {
// do something
}
});
当文本区域的值发生变化时,GWT将自动生成一个ValueChangeEvent,您可以在我标记为“do something”的部分中使用它。