【问题标题】:How to instantiate an Event Handler interface in GWT using uiBinder?如何使用 uiBinder 在 GWT 中实例化事件处理程序接口?
【发布时间】:2011-12-12 17:39:40
【问题描述】:

我正在尝试使用自定义小部件:gwtupload 和它的自定义处理程序。处理程序被定义为接口,如 Interface.OnCustomEventHandler 和方法,根据 API,我想使用的方法就像这段代码,但我不知道如何用 uiBinder 实现它。:

void onCustomEvent (Interface interface) 

通常对于 uiBinder,我将此代码用于常规 gwt 小部件:

@Widget widget;

@UiHandler("widget")
void onClick(ClickEvent event){
  //Handle the event processing here.
}

目前,当我尝试这个时,

@UiHandler("widget")
void onCustomEvent(ICustomInterface customInterface){
  ...

我得到这个空指针异常:

[错误] 生成器 'com.google.gwt.uibinder.rebind.UiBinderGenerator' 在重新绑定 '...ViewImpl.ViewImplUiBinder' 时引发异常 java.lang.NullPointerException

这是我尝试的新代码:

public class MUpld extends Composite {
  private static MUpldUiBinder uiBinder = GWT.create(MUpldUiBinder.class);
  interface MUpldUiBinder extends UiBinder<Widget, MUpld> {
  }
  @UiField MultiUploader uploader;    

public MUpld() {
          final IUploader.OnFinishUploaderHandler onFinishUploaderHandler = new IUploader.OnFinishUploaderHandler() {
                @Override
                public void onFinish(IUploader iUploader) { 
                    if (uploader.getStatus() == Status.SUCCESS){
                      System.out.println("In the onFinish method!");
                    }   
                }
        };
        initWidget(uiBinder.createAndBindUi(this));
uploader.addOnFinishUploadHandler(onFinishUploaderHandler);
      }
}

在调试器中,我看到处理程序附加到我定义的上传器小部件,但是一旦代码移出此类,当前上传器就变成了不同的上传器。我尝试使用 final 修饰符,因为这是我知道将变量放入内部类的唯一方法,但 gwt 会抱怨:

[ERROR] com.cdg.complexityCalculator.client.view.MUpld 没有默认(零参数)构造函数。

要解决此问题,您可以在 UiBinder 的所有者上定义 @UiFactory 方法,或者使用 @UiConstructor 注释 MUpld 的构造函数。

我无法让这些选项中的任何一个起作用,但我意识到我已经切换了最后两行代码,所以我将其更改为我现在所拥有的,并且处理程序加载了正确的对象。

关于如何让它发挥作用的任何想法?其他一切都准备就绪,我只需要在我的 servlet 完成处理后捕获此事件。

【问题讨论】:

    标签: gwt uibinder


    【解决方案1】:

    当我更改最后两行代码时,处理程序已正确加载。现在正在使用绑定到正确对象的处理程序创建对象。

    initWidget(uiBinder.createAndBindUi(this));
    uploader.addOnFinishUploadHandler(onFinishUploaderHandler);
    

    我必须等到 uiBinder 创建了上传器小部件的实例,然后才能将处理程序添加到它。

    我学到的一个技巧是在构造函数中为您创建的复合小部件添加一个处理程序,这样它就更像是一个封装组件。它处理自己的事件。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2011-03-10
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多