0
votes

I'm trying to use a custom widget: gwtupload with it's custom handlers. The handlers are defined as interfaces, as in, Interface.OnCustomEventHandler and the method, according to the API, that I want to use is like this code, but I'm not sure how to implement this with uiBinder.:

void onCustomEvent (Interface interface) 

Normally for uiBinder I use this code for the regular gwt widgets:

@Widget widget;

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

Presently, when I try this,

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

I get this null pointer exception:

[ERROR] Generator 'com.google.gwt.uibinder.rebind.UiBinderGenerator' threw an exception while rebinding '...ViewImpl.ViewImplUiBinder' java.lang.NullPointerException

Here is the new code I tried:

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);
      }
}

In the debugger, I saw the handler get attached to the uploader widget I defined, but then the current uploader became a different one once the code moved out of this class. I tried using the final modifier, as that is the only way I know to get a variable into an inner class, but gwt would complain with:

[ERROR] com.cdg.complexityCalculator.client.view.MUpld has no default (zero args) constructor.

To fix this, you can define a @UiFactory method on the UiBinder's owner, or annotate a constructor of MUpld with @UiConstructor.

I wasn't able to get either of those options to work, but I realized I had the last two lines of code switched, so I changed it to what I have now and the handler loaded up with the correct object.

Any ideas as to how to get this to work? Everything else is in place, I just need a way to capture this event after my servlet has finished processing.

1

1 Answers

0
votes

When I changed the last two lines of code, the handler got loaded properly. Now the objects are being created with the handler binding to the correct object.

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

I had to wait until the uiBinder created the instance of the uploader widget, then I was able to add the handler to it.

One of the tricks I've learned is to add a handler in the constructor for a composite widget you create, that way it's more of an encapsulated component. It handles it's own events.