我正在使用 GWT 2.5.0
我的意图是创建一个绑定到ParentBean
对象的编辑器层次结构。ParentBean
包含 a List<Group>
,而beanGroup
有 aList<ChildBean>
和List<Group>
。从我发现的编辑器教程中,创建一个包含 ListEditor 作为其子编辑器之一的编辑器似乎很简单。但父编辑器似乎从未正确初始化子 ListEditor。
这是我如何尝试执行此操作的解释。
从下面的代码中,我创建了一个ParentBeanEditor
由另一个编辑器组成的GroupListEditor
. 工具。
_
然后,包含一个子编辑器和一个.GroupListEditor
IsEditor<ListEditor<Group, GroupEditor>>
GroupEditor
GroupListEditor
ChildBeanEditor
ParentBeanEditor
我用ParentBean
包含对象列表的a初始化了Group
,但GroupEditor
从未为任何Group
对象构造过。
我在方法中放置了断点EditorSource<GroupEditor>.create(int)
以验证s 中的每个都GroupEditor
被创建,但断点从未被命中(ListEditor 没有构造编辑器)。Group
ParentBean
我预计GroupListEditor
会被初始化,因为它是ParentBeanEditor
. 列表和编辑器链都没有设置在GroupListEditor
. 我试图通过扩展来GroupListEditor
直接设置子编辑器的列表。这样做,我上面提到的断点被击中,并试图将 a 附加到编辑器链。但是编辑器链从未设置,并且在第 95 行抛出了 NPE。ParentBeanEditor
ValueAwareEditor<ParentBean>
GroupListEditor
GroupEditor
ListEditorWrapper
例子
这是GroupListEditor
未按预期初始化的示例。永远不会设置,这EditorChain
会导致在ListEditorWrapper
第 95 行抛出 NPE。
数据模型
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());
}
}
组列表编辑器
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;
}
}
组编辑
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
提到的多态编辑器方法。这意味着特定的叶子编辑器根据枚举的值附加到编辑器链。但是,我没有显示该代码,因为我无法正确初始化。ChildBean.getType()
GroupListEditor