【问题标题】:Declare 2 standalone components in one UiBinder file?在一个 UiBinder 文件中声明 2 个独立组件?
【发布时间】:2014-01-30 17:12:37
【问题描述】:

我有一个触发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 将不起作用。

【问题讨论】:

    标签: java gwt uibinder


    【解决方案1】:

    您已经部分回答了自己的问题。

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

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

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

    【讨论】:

      【解决方案2】:

      你可以有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 的内部类。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2017-04-28
        • 1970-01-01
        • 2020-11-13
        • 2017-09-21
        • 2015-09-22
        相关资源
        最近更新 更多