gwt uibinder в абстрактном родительском классе - PullRequest
3 голосов
/ 07 декабря 2011

Мне интересно, есть ли способ встроить логику uwinder gwt в абстрактный родительский класс, чтобы мне не приходилось повторять код в каждом классе, который я хочу связать.

например,Я хотел бы иметь возможность сделать что-то вроде этого:

public abstract class BasePanel<Panel extends BasePanel> extends Composite {
    interface Binder<BinderPanel extends BasePanel> extends UiBinder<Widget, BinderPanel> { }
    private static final Binder binder = GWT.create(Binder<Panel>.class);

    public BasePanel() {
        initWidget(binder.createAndBindUi(this));
        init();
    }
}

в принципе это позволит любым дочерним классам делать что-то вроде этого:

public MyPanel extends BasePanel<MyPanel> {
    //my code here
}

конструктор по умолчанию будет заботитьсяиз всего кода, связывающего MyPanel с MyPanel.ui.xml.

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

заранее спасибо.

1 Ответ

6 голосов
/ 08 декабря 2011

Правильный способ создания абстрактных классов связывания пользовательского интерфейса - определить суперкласс, который будет содержать логику, общую для всех виджетов подкласса.Этот класс может иметь поля, помеченные как @UiField, обработчики событий и все остальное, что входит в класс связывания пользовательского интерфейса.А дочерние классы на самом деле имеют логику реализации связующего интерфейса пользователя.Вот как то так:

public abstract BaseWidget extends Composite {
  @UiField TextBox textBoxCommon1;
  @UiField TextBox textBoxCommon2;

  @UiHandler("textBoxCommon1")
  void onTextBoxCommon1Changed( ValueChangeEvent<String> event ) {
    //...
  }

  @UiHandler("textBoxCommon2")
  void onTextBoxCommon2Changed( ValueChangeEvent<String> event ) {
    //...
  }
}

public class SomeWidget extends BaseWidget {
  interface SomeWidgetUiBinder extends UiBinder<Widget,SomeWidget> {}

  private static SomeWidgetUiBinder uiBinder = GWT.create(SomeWidgetUiBinder.class);

  @UiField Button someWidgetButton;

  public SomeWidget() {
    initWidget(uiBinder.createAndBindUi(this));
  }

  @UiHandler("someWidgetButton")
  void onButtonClicked(ClickEvent e) {
    Window.alert(textBoxCommon1.getValue());
  }
}
...