UiBinder中的通用小部件

时间:2012-08-09 16:35:33

标签: gwt uibinder

我刚创建了widget:

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添加它?它有可能吗?

3 个答案:

答案 0 :(得分: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>

答案 1 :(得分: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。

答案 2 :(得分: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方法,如上所述in the documentation