GWT2.5.0を使用しています
私の意図は、ParentBean
オブジェクトにバインドするエディター階層を作成することでした。には、ParentBean
が含まれList<Group>
、Group
Beanにはとが含まList<ChildBean>
れますList<Group>
。私が見つけたエディターのチュートリアルから、サブエディターの1つとしてListEditorを含むエディターを作成するのは簡単に思えました。ただし、親エディターがサブListEditorを適切に初期化することはないようです。
これが私がこれをどのように試みたかの説明です。
以下のコードから、ParentBeanEditor
他の1つのエディターで構成されるを作成しましたGroupListEditor
。実装し
ます。
次に、にはサブエディタとが含まれます。GroupListEditor
IsEditor<ListEditor<Group, GroupEditor>>
GroupEditor
GroupListEditor
ChildBeanEditor
オブジェクトのリストを含むをで初期化しParentBeanEditor
ましたが、どのオブジェクトに対しても構築されていません。メソッドにブレークポイントを設定して、のそれぞれに対してsが作成されていることを確認しましたが、ブレークポイントに到達することはありませんでした(ListEditorはエディターを構築していませんでした)。ParentBean
Group
GroupEditor
Group
EditorSource<GroupEditor>.create(int)
GroupEditor
Group
ParentBean
GroupListEditor
のサブエディターであるため、が初期化されることを期待していましたParentBeanEditor
。リストもエディターチェーンもに設定されていませんGroupListEditor
。サブエディタのリストを拡張して、GroupListEditor
直接に設定してみました。これを行うと、前述のブレークポイントに到達し、エディターチェーンにをアタッチしようとしました。しかし、エディターチェーンが設定されることはなく、 95行目にNPEがスローされます。ParentBeanEditor
ValueAwareEditor<ParentBean>
GroupListEditor
GroupEditor
ListEditorWrapper
例
GroupListEditor
これは、が期待どおりに初期化されていない例です。は設定されないため、 95行EditorChain
目にNPEがスローされます。ListEditorWrapper
データ・モデル
public interface ParentBean {
...
List<Group> getGroups();
}
public interface Group {
...
List<ChildBean> getChildBeans();
List<Group> getGroups();
}
public interface ChildBean {
// ChildType is an enum
ChildType getChildType();
}
編集者
ParentBeanエディター
public class ParentBeanEditor extends Composite implements ValueAwareEditor<ParentBean> {
interface ParentBeanEditorUiBinder extends UiBinder<Widget, ParentBeanEditor> {
}
private static ParentBeanEditorUiBinder BINDER = GWT.create(ParentBeanEditorUiBinder.class);
@Path("groups")
@UiField
GroupListEditor groupsEditor;
public ParentBeanEditor() {
initWidget(BINDER.createAndBindUi(this));
}
@Override
public void setDelegate(EditorDelegate<ParentBean> delegate) {}
@Override
public void flush() {}
@Override
public void onPropertyChange(String... paths) {}
@Override
public void setValue(ParentBean value) {
groupsEditor.asEditor().setValue(value.getGroups());
}
}
GroupListEditor
public class GroupListEditor extends Composite implements IsEditor<ListEditor<Group, GroupEditor>>{
interface GroupListEditorUiBinder extends UiBinder<VerticalLayoutContainer, TemplateGroupListEditor> {
}
private static GroupListEditorUiBinder BINDER = GWT.create(GroupListEditorUiBinder.class);
private class GroupEditorSource extends EditorSource<GroupEditor> {
private final GroupListEditor GroupListEditor;
public GroupEditorSource(GroupListEditor GroupListEditor) {
this.GroupListEditor = GroupListEditor;
}
@Override
public GroupEditor create(int index) {
GroupEditor subEditor = new GroupEditor();
GroupListEditor.getGroupsContainer().insert(subEditor, index);
return subEditor;
}
@Override
public void dispose(GroupEditor subEditor){
subEditor.removeFromParent();
}
@Override
public void setIndex(GroupEditor editor, int index){
GroupListEditor.getGroupsContainer().insert(editor, index);
}
}
private final ListEditor<Group, GroupEditor> editor = ListEditor.of(new GroupEditorSource(this));
@UiField
VerticalLayoutContainer groupsContainer;
public GroupListEditor() {
initWidget(BINDER.createAndBindUi(this));
}
public InsertResizeContainer getGroupsContainer() {
return groupsContainer;
}
@Override
public ListEditor<Group, GroupEditor> asEditor() {
return editor;
}
}
GroupEditor
public class GroupEditor extends Composite implements ValueAwareEditor<Group> {
interface GroupEditorUiBinder extends UiBinder<Widget, GroupEditor> {}
private static GroupEditorUiBinder BINDER = GWT.create(GroupEditorUiBinder.class);
@Ignore
@UiField
FieldSet groupField;
@UiField
@Path("childBeans")
ChildBeanListEditor childBeansEditor;
@UiField
@Path("groups")
GroupListEditor groupsEditor;
public GroupEditor() {
initWidget(BINDER.createAndBindUi(this));
}
@Override
public void setDelegate(EditorDelegate<Group> delegate) {}
@Override
public void flush() { }
@Override
public void onPropertyChange(String... paths) {}
@Override
public void setValue(Group value) {
// When the value is set, update the FieldSet header text
groupField.setHeadingText(value.getLabel());
groupsEditor.asEditor().setValue(value.getGroups());
childBeansEditor.asEditor().setValue(value.getChildBeans());
}
}
ここでChildBeanListEditor
言及されているポリモーフィックエディターの方法論を使用します。列挙型の値に基づいて、特定のleafeditorがエディターチェーンに接続されていることを意味しますChildBean.getType()
。GroupListEditor
ただし、を適切に初期化することができないため、そのコードは表示していません。