在一个UiBinder文件中声明2个独立组件?

时间:2014-01-30 17:12:38

标签: java gwt uibinder

我有一个触发ValidEvent(GXT自定义事件)的对话框:

public class MyDialog extends Dialog implements HasValidHandlers {

  ...
}

因此,如果我将其包含在UiBinder文件中,我应该可以执行类似的操作(请参阅@UiHandler):

@UiField
MyDialog myDialog;

@UiHandler("myDialog")
void onValid(ValidEvent event) {
  ..
}

我希望将MyDialog包含在也使用UiBinder定义的小部件中:

public class MyWidget extends Composite {

  @UiField
  MyDialog myDialog;

  public MyWidget(Binder binder) {
    initWidget(binder.createAndBindUi(this));
  }

  @UiHandler("myDialog")
  void onValid(ValidEvent event) {
    ..
  }

  interface Binder extends UiBinder<Widget, MyWidget> {}

}

问题:将组件放在ui.xml文件中的位置?

在组件中包含对话框会导致图形问题,因为UiBinder会尝试在窗口小部件中添加对话框:

<g:HTMLPanel>
  <MyDialog ui:field="myDialog"/>
</g:HTMLPanel>

但是:在uIBinder中,我只能有一个根组件。

问题:如何在单个UiBinder文件中声明2个不同的组件?我想避免使用ui.xml来声明对话框,如果我通过new进行实例化,则@UiHandler将无效。

2 个答案:

答案 0 :(得分:0)

你部分回答了自己的问题。

在组件中包含对话框会导致图形问题,因为UiBinder会尝试在窗口小部件中添加对话框:

因此,您需要为组件单独创建ui-binder,因为您也打算将其用作uiField等等!

根据我的猜测(根据我的知识),每个ui-binder创建一个小部件,可以根据需要在另一个ui-binder或文件中引用它。

答案 1 :(得分:0)

您可以two UiBinder in the same widget

public class MyWidget extends Composite {

  MyDialog myDialog;

  public MyWidget(Binder binder) {
    initWidget(binder.createAndBindUi(this));
    DialogBinder dialogBinder = GWT.create(DialogBinder.class);
    myDialog = dialogBinder.createAndBindUi(this);
  }

  @UiHandler("myDialog")
  void onValid(ValidEvent event) {
    ..
  }

  interface Binder extends UiBinder<Widget, MyWidget> {}

  @UiTemplate("DialogBinder.ui.xml")
  interface DialogBinder extends UiBinder<MyDialog, MyWidget> {}

}

您的DialogBinder.ui.xml看起来像:

<ui:UiBinder xmlns:ui="urn:ui:com.google.gwt.uibinder">
    <MyDialog ui:field="myDialog"/>
</ui:UiBinder>

我没有测试它,但是不同的@UiField可能存在问题。 你可以这个拥有所有Dialog @UiField和@UiHander的内部类。