我有一个触发ValidEvent
(GXT自定义事件)的对话框:
public class MyDialog extends Dialog implements HasValidHandlers {
...
}
因此,如果我将其包含在UiBinder
文件中,我应该可以执行类似的操作(请参阅@UiHandler):
@UiField
MyDialog myDialog;
@UiHandler("myDialog")
void onValid(ValidEvent event) {
..
}
我希望将MyDialog
包含在也使用UiBinder
定义的小部件中:
public class MyWidget extends Composite {
@UiField
MyDialog myDialog;
public MyWidget(Binder binder) {
initWidget(binder.createAndBindUi(this));
}
@UiHandler("myDialog")
void onValid(ValidEvent event) {
..
}
interface Binder extends UiBinder<Widget, MyWidget> {}
}
问题:将组件放在ui.xml
文件中的位置?
在组件中包含对话框会导致图形问题,因为UiBinder会尝试在窗口小部件中添加对话框:
<g:HTMLPanel>
<MyDialog ui:field="myDialog"/>
</g:HTMLPanel>
但是:在uIBinder
中,我只能有一个根组件。
问题:如何在单个UiBinder
文件中声明2个不同的组件?我想避免使用ui.xml
来声明对话框,如果我通过new
进行实例化,则@UiHandler
将无效。
答案 0 :(得分:0)
你部分回答了自己的问题。
在组件中包含对话框会导致图形问题,因为UiBinder会尝试在窗口小部件中添加对话框:
因此,您需要为组件单独创建ui-binder
,因为您也打算将其用作uiField
等等!
根据我的猜测(根据我的知识),每个ui-binder
创建一个小部件,可以根据需要在另一个ui-binder
或文件中引用它。
答案 1 :(得分:0)
您可以two UiBinder in the same widget:
public class MyWidget extends Composite {
MyDialog myDialog;
public MyWidget(Binder binder) {
initWidget(binder.createAndBindUi(this));
DialogBinder dialogBinder = GWT.create(DialogBinder.class);
myDialog = dialogBinder.createAndBindUi(this);
}
@UiHandler("myDialog")
void onValid(ValidEvent event) {
..
}
interface Binder extends UiBinder<Widget, MyWidget> {}
@UiTemplate("DialogBinder.ui.xml")
interface DialogBinder extends UiBinder<MyDialog, MyWidget> {}
}
您的DialogBinder.ui.xml看起来像:
<ui:UiBinder xmlns:ui="urn:ui:com.google.gwt.uibinder">
<MyDialog ui:field="myDialog"/>
</ui:UiBinder>
我没有测试它,但是不同的@UiField可能存在问题。 你可以这个拥有所有Dialog @UiField和@UiHander的内部类。