【问题标题】:Custom ValueChangeHandler GWT自定义 ValueChangeHandler GWT
【发布时间】:2011-10-17 17:33:03
【问题描述】:

我需要编写一个自定义的ValueChangeHandler 并调用onValueChange(ValueChangeEvent)。但是我不明白如何写ValueChangeEvent

也许我对整个 GWT 事件系统的理解是错误的。有人可以帮忙吗?

编辑: 我在问如何创建我自己的调度 ValueChangeEvent 的类。我知道怎么听。

ValueChangeEvent的构造函数不可见,无法创建。

【问题讨论】:

    标签: java javascript gwt


    【解决方案1】:

    实际上,不是创建新的 EventBus 或 HandlerManager,因为您的小部件将是 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());
            }
        }
    }
    

    【讨论】:

    • 该类只需要实现 HasValue 接口即可。
    【解决方案2】:

    真的很晚才回答,但我刚刚解决了这个问题:

    ValueChangeEvent.fire(hasValueChangeHandlerInstance, getValue());
    

    【讨论】:

      【解决方案3】:

      如果您想触发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 直接调度一个事件是通过 fire 方法完成的:

      ValueChangeEvent.fire(this, value);
      

      其中this 是指实现HasValueChangeHandlers 的类/字段,value 是指已更改的值并且您要调度事件。

      【讨论】:

      • 谢谢,我现在已经完成了其他所有工作,但我不知道 EventBut。
      • @Hilibrand - 嘿,我需要在没有 EventBus 的 GWT 2.0.4 中再次执行此操作。我找不到任何参考。你知道它是怎么做的吗?
      • 对于 GWT 2.0.4,您可以使用 com.google.gwt.event.shared.HandlerManager 类。您可以使用当前类对其进行初始化:new HandlerManager(this);
      【解决方案4】:

      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,你可以在我标记为“做某事”的部分使用。

      【讨论】:

      • 我不需要那个。我正在创建自己的“TextArea”,我需要它来像 TextArea 一样调度 ValueChangeEvent。
      • 好的,您的问题表明您想知道如何编写 ValueChangeHandler(而不是 HasValueChangeHandlers 实现):-)
      • 是的,很抱歉这个误导性问题。英语不是我的母语:(。
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2014-01-29
      • 1970-01-01
      • 2012-11-20
      • 1970-01-01
      相关资源
      最近更新 更多