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

4

3 回答 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>

于 2012-08-10T06:41:08.947 回答
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。

于 2012-08-10T07:26:01.677 回答
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中提到的方法。

于 2014-10-22T23:46:34.770 回答