Использование 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">&nbsp;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">&nbsp;</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" для примера.

Другие вопросы по тегам