如何使用uiBinder在GWT中实例化事件处理程序接口?

时间:2011-12-12 17:39:40

标签: gwt uibinder

我正在尝试使用自定义小部件: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会抱怨:

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

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

我无法使这些选项中的任何一个工作,但我意识到我已经切换了最后两行代码,因此我将其更改为现在的内容并且处理程序加载了正确的对象。

有关如何使其发挥作用的任何想法?其他一切都已到位,我只需要一种方法来在我的servlet完成处理后捕获这个事件。

1 个答案:

答案 0 :(得分:0)

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

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

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

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