我刚创建了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添加它?它有可能吗?
答案 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。