Как создать интерфейс обработчика событий в GWT с помощью uiBinder? - PullRequest
0 голосов
/ 12 декабря 2011

Я пытаюсь использовать пользовательский виджет: 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 не имеет конструктора по умолчанию (ноль аргументов).

Чтобы исправить это, вы можете определить метод @UiFactory для владельца UiBinder или аннотировать конструктор MUpld с помощью @ UiConstructor.

Мне не удалось заставить работать ни одну из этих опций, но я понял, что переключил последние две строки кода, поэтому я изменил его на то, что у меня сейчас, и обработчик загрузился с правильным объектом.

Есть идеи, как заставить это работать? Все остальное на месте, мне просто нужен способ перехватить это событие после того, как мой сервлет завершил обработку.

1 Ответ

0 голосов
/ 15 декабря 2011

Когда я изменил последние две строки кода, обработчик загрузился правильно. Теперь объекты создаются с привязкой обработчика к нужному объекту.

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

Мне пришлось подождать, пока uiBinder создаст экземпляр виджета загрузчика, затем я смог добавить обработчик к нему.

Один из приемов, которые я выучил, - это добавить обработчик в конструктор для составного виджета, который вы создаете, таким образом, это скорее инкапсулированный компонент. Он обрабатывает свои собственные события.

...