UiBinder中的通用小部件

5

我刚刚创建了一个小部件:

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文件中指定泛型类型。 - djjeck
3个回答

7

可以的。您需要将包含 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'和使用语法<my:myWidget>

4
为了使您的小部件在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。

0

没有一个答案似乎专注于通用部分。正如其他人所提到的,您可以通过省略通用类型在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方法,如文档中所述


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接