【问题标题】:Generic widget in UiBinderUiBinder 中的通用小部件
【发布时间】:2012-08-09 16:35:32
【问题描述】:

我刚刚创建了小部件:

public class myWidget<T> extends FlowPanel {
private T value;

public T getValue()
{
    return value;
}

public myWidget(T[] values) {
    for (T value : values)
    {
        //do action
    }
}

如何使用 UiBinder 添加它?有可能吗?

【问题讨论】:

  • 如果您只是询问使用泛型是否有问题,那么答案是:您可以像常规小部件一样使用。 GWT 将实例化小部件并将其放入您的 @UiField 字段中,即使您无法在 xml 文件中指定泛型类型。

标签: gwt uibinder


【解决方案1】:

是的,你可以。您必须将包含 myWidget 类的包导入 XML 命名空间。假设你的包名为com.test.widgets,声明式布局如下所示:

<ui:UiBinder xmlns:ui='urn:ui:com.google.gwt.uibinder'
    xmlns:g='urn:import:com.google.gwt.user.client.ui'
    xmlns:my='urn:import:com.test.widgets'>

  <my:myWidget>
    <g:Label>A label</g:Label>
    <g:Label>A second label</g:Label>
  </my:myWidget>
</ui:UiBinder>

注意导入xmlns:my='urn:import:com.test.widgets' 和用法&lt;my:myWidget&gt;

【讨论】:

    【解决方案2】:

    要让你的小部件在 Uibinder 中可用,它必须至少实现 IsWidget 接口。作为一个小部件,它当然已经实现了 IsWidget。

    因此,任何非小部件也可以通过实现 IsWidget 来用作 uibinder 中的子小部件元素。

    IsWidget 接口需要非小部件来实现方法asWidget()。因此,这样的非小部件必须充当小部件容器。

    实现 IsWidget 将只允许将类用作子小部件元素。

    假设你的班级是

    com.zzz.client.ui.HelloKitty
    

    为了能够拥有子小部件元素,它必须实现HasWidgets

    <ui:UiBinder
      xmlns:ui='urn:ui:com.google.gwt.uibinder'
      xmlns:g='urn:import:com.google.gwt.user.client.ui'
      xmlns:z='urn:import:com.zzz.client.ui'>
    
      <g:VerticalPanel>
        <z:HelloKitty>
          <g:button ..../>
          <g:textbox>asdf</g:textbox>
        </z:HelloKitty>
      <g:VerticalPanel>
    
    </ui:UiBinder>
    

    或者,它也可以只实现 HasOneWidget。

    为了让类在它的 uibinder 标签之间有文本,它必须实现 HasText。

    <ui:UiBinder
      xmlns:ui='urn:ui:com.google.gwt.uibinder'
      xmlns:g='urn:import:com.google.gwt.user.client.ui'
      xmlns:z='urn:import:com.zzz.client.ui'>
    
      <g:VerticalPanel>
        <z:HelloKitty>qwerty</z:HelloKitty>
      <g:VerticalPanel>
    
    </ui:UiBinder>
    

    为了在其标签之间接受有效的 HTML,我相信你应该让它实现 HasHTML。

    【讨论】:

      【解决方案3】:

      似乎没有一个答案集中在 generic 部分。正如其他人所提到的,您可以通过省略泛型类型轻松地在 UiBinder 模板中添加泛型小部件:

      <ui:UiBinder xmlns:ui='urn:ui:com.google.gwt.uibinder'
                   xmlns:g='urn:import:com.google.gwt.user.client.ui'
                   xmlns:my='urn:import:com.test.widgets'>
          <my:myWidget />
      </ui:UiBinder>
      

      但是,如果你想在你的 Java 代码中引用这个小部件呢?您是否也应该在此处省略泛型类型并招致编译器警告的愤怒?

      谢天谢地,没有。 UiBinder 在类型方面非常松散,因为泛型类型只是提示,您可以在支持上述 UiBinder 模板的 Java 代码中避开以下内容:

      @UiField(provided = true)
      myWidget<Date> myWidget = new myWidget(new Date(), new Date());
      

      或者,您也可以使用@UiFactory 方法,如in the documentation 所述。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2011-04-25
        • 1970-01-01
        • 1970-01-01
        • 2011-02-08
        • 2012-07-11
        相关资源
        最近更新 更多