Использование GWT Nested Editor вызывает ошибку несоответствия типов
В настоящее время я пытаюсь заставить вложенные редакторы работать в GWT/GWTP.
У меня есть пример работы без вложенности (спасибо вам, ребята).
Когда я пытаюсь добавить подредактор в это представление, я получаю эту ошибку:
... ContainerEditorDialogView_BinderImpl.java 'Строка 270: Несоответствие типов: невозможно преобразовать из элемента в GroupListEditor
Это происходит, когда я пытаюсь добавить подредактор так:
public class ContainerEditorDialogView extends
PopupViewWithUiHandlers<ContainerEditorDialogUiHandlers> implements
ContainerEditorDialogPresenterWidget.MyView, Editor<ContainerDto> {
interface Binder extends UiBinder<PopupPanel, ContainerEditorDialogView> {
}
public interface Driver extends SimpleBeanEditorDriver<ContainerDto, ContainerEditorDialogView> {
}
@UiField
TextBox uuid;
@UiField
TextBox name;
@UiField
TextBox groups;
@UiField
GroupListEditor groupListEditor;
...
Это мой GroupListEditor:
public class GroupListEditor extends Composite implements IsEditor<ListEditor<String, GroupItemEditor>> {
private static StringListEditorUiBinder uiBinder = GWT.create(StringListEditorUiBinder.class);
interface StringListEditorUiBinder extends UiBinder<Widget, GroupListEditor> {}
private class StringItemEditorSource extends EditorSource<GroupItemEditor> {
@Override
public GroupItemEditor create(final int index) {
GroupItemEditor subEditor = new GroupItemEditor();
groups.insert(subEditor, index);
subEditor.addDeleteHandler(new EditorDeleteEvent.EditorDeleteHandler() {
public void onEditorDeleteEvent(EditorDeleteEvent event) {
remove(index);
}
});
return subEditor;
}
@Override
public void dispose(GroupItemEditor subEditor) {
subEditor.removeFromParent();
}
@Override
public void setIndex(GroupItemEditor editor, int index) {
groups.insert(editor, index);
}
}
private ListEditor<String, GroupItemEditor> editor = ListEditor.of(new StringItemEditorSource());
@UiField
FlowPanel pWidget;
@UiField
PushButton bAdd;
@UiField
FlowPanel groups;
@UiField
HTML listName;
public GroupListEditor() {
initWidget(uiBinder.createAndBindUi(this));
}
public void setName(String s) {
if (s == null) {
listName.setHTML("");
} else {
listName.setHTML(s);
}
}
@UiHandler("bAdd")
void onBAddClick(ClickEvent event) {
add();
}
private void add() {
String s = "";
editor.getList().add(s);
}
@Override
public ListEditor<String, GroupItemEditor> asEditor() {
return editor;
}
private void remove(final int index) {
editor.getList().remove(index);
}
}
и его макет:
<!DOCTYPE ui:UiBinder SYSTEM "http://dl.google.com/gwt/DTD/xhtml.ent">
<ui:UiBinder xmlns:ui="urn:ui:com.google.gwt.uibinder"
xmlns:g="urn:import:com.google.gwt.user.client.ui">
<g:FlowPanel ui:field="pWidget">
<g:HorizontalPanel>
<g:PushButton text="Add" ui:field="bAdd"/>
<g:Cell verticalAlignment="ALIGN_MIDDLE">
<g:HTML wordWrap="true"> Todos</g:HTML>
</g:Cell>
</g:HorizontalPanel>
<g:HTML ui:field="listName"/>
<g:FlowPanel ui:field="groups"/>
</g:FlowPanel>
</ui:UiBinder>
И редактор элементов:
public class GroupItemEditor extends Composite implements LeafValueEditor<String> {
interface StringItemEditorUiBinder extends UiBinder<Widget, GroupItemEditor> {}
private static StringItemEditorUiBinder uiBinder = GWT.create(StringItemEditorUiBinder.class);
@UiField
TextBox tbvalue;
@UiField
PushButton bDelete;
public GroupItemEditor() {
initWidget(uiBinder.createAndBindUi(this));
}
@UiHandler("bDelete")
void onBDeleteClick(ClickEvent event) {
fireDeleteEvent();
}
private void fireDeleteEvent() {
//fireEvent(new EditorDeleteEvent());
}
public final HandlerRegistration addDeleteHandler(EditorDeleteEvent.EditorDeleteHandler handler) {
return addHandler(handler, EditorDeleteEvent.TYPE);
}
@Override
public void setValue(String value) {
tbvalue.setValue(value);
}
@Override
public String getValue() {
return tbvalue.getValue().trim();
}
И его макет:
<!DOCTYPE ui:UiBinder SYSTEM "http://dl.google.com/gwt/DTD/xhtml.ent">
<ui:UiBinder xmlns:ui="urn:ui:com.google.gwt.uibinder"
xmlns:g="urn:import:com.google.gwt.user.client.ui" xmlns:p1="urn:import:com.google.gwt.editor.ui.client">
<ui:style>
.important {
font-weight: bold;
}
</ui:style>
<g:FlowPanel>
<g:HorizontalPanel>
<g:TextBox ui:field="tbvalue"/>
<g:HTML wordWrap="true"> </g:HTML>
<g:Cell verticalAlignment="ALIGN_MIDDLE">
<g:PushButton text="X" ui:field="bDelete"/>
</g:Cell>
</g:HorizontalPanel>
</g:FlowPanel>
</ui:UiBinder>
РЕДАКТИРОВАТЬ: Вот ContainerEditorDialogView.ui.xml
<!DOCTYPE ui:UiBinder SYSTEM "http://dl.google.com/gwt/DTD/xhtml.ent">
<ui:UiBinder xmlns:ui="urn:ui:com.google.gwt.uibinder"
xmlns:g="urn:import:com.google.gwt.user.client.ui">
<g:DialogBox modal="true">
<g:caption>
<b>Local dialog box example</b>
</g:caption>
<g:HTMLPanel>
Container Settings:
<table>
<tr>
<td>
UUID:
</td>
<td>
<g:TextBox ui:field="uuid" />
</td>
</tr>
<tr>
<td>
Container Name:
</td>
<td>
<g:TextBox ui:field="name" />
</td>
</tr>
<tr>
<td>
Groups (Editor):
</td>
<td>
<GroupListEditor ui:field="groupListEditor" />
</td>
</tr>
<tr>
<td>
Groups:
</td>
<td>
<g:TextBox ui:field="groups" />
</td>
</tr>
<tr>
<td>
IMEI:
</td>
<td>
<g:TextBox ui:field="imei" />
</td>
</tr>
<tr>
<td>
Type:
</td>
<td>
<g:TextBox ui:field="type" />
</td>
</tr>
<tr>
<td>
<g:Button ui:field="okButton">Ok</g:Button>
</td>
<td>
<g:Button ui:field="cancelButton">Cancel</g:Button>
</td>
</tr>
</table>
</g:HTMLPanel>
</g:DialogBox>
</ui:UiBinder>
У вас есть идеи, что может вызвать эту ошибку? Всей информации, которую я мог найти, было около трех лет...
Спасибо:)
1 ответ
<GroupListEditor ui:field="groupListEditor" />
Так как вы хотите, чтобы это был виджет, перед ним должно быть пространство имен, как это делают другие виджеты. Это пространство имен должно быть определено в верхней части с пакетом, который GroupListEditor
живет в. Например, если это было pack.age.to.my.client.widgets.GroupListEditor
тогда это будет выглядеть так:
<ui:UiBinder xmlns:ui="urn:ui:com.google.gwt.uibinder"
xmlns:g="urn:import:com.google.gwt.user.client.ui"
xmlns:my="urn:import:pack.age.to.my.client.widgets">
...
<my:GroupListEditor ui:field="groupListEditor" />
Вы можете сделать пространство имен таким, каким хотите, я использовал "my" для примера.