我刚刚创建了一个小部件:
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怎样添加它?是否完全可行?
可以的。您需要将包含 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>
。asWidget()
。因此,这种非小部件将充当小部件容器。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>
没有一个答案似乎专注于通用部分。正如其他人所提到的,您可以通过省略通用类型在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
方法,如文档中所述。
@UiField
字段中,即使你无法在xml文件中指定泛型类型。 - djjeck