【发布时间】:2012-12-06 16:54:47
【问题描述】:
我正在使用 GWT 2.5.0
我的意图是创建一个绑定到ParentBean 对象的编辑器层次结构。 ParentBean 包含 List<Group>,Group bean 包含 List<ChildBean> 和 List<Group>。从我发现的编辑器教程中,创建一个包含 ListEditor 作为其子编辑器之一的编辑器似乎很简单。但父编辑器似乎从未正确初始化子 ListEditor。
这是我如何尝试这样做的解释。
从下面的代码中,我创建了一个ParentBeanEditor,它由另一个编辑器GroupListEditor 组成。 GroupListEditor 实现 IsEditor<ListEditor<Group, GroupEditor>>。
然后,GroupEditor 包含一个GroupListEditor 子编辑器和一个ChildBeanEditor。
我用包含Group 对象列表的ParentBean 初始化ParentBeanEditor,但没有为任何Group 对象构造GroupEditor。
我在EditorSource<GroupEditor>.create(int) 方法中设置了断点,以验证是否为ParentBean 中的每个Group 创建了GroupEditors,但从未命中断点(ListEditor 未构建编辑器)。
我预计 GroupListEditor 会被初始化,因为它是 ParentBeanEditor 的子编辑器。 GroupListEditor 中既没有设置列表也没有设置编辑器链。我试图通过扩展ValueAwareEditor<ParentBean> 直接在ParentBeanEditor 中设置GroupListEditor 子编辑器的列表。这样做,我上面提到的断点被击中,GroupListEditor 试图将GroupEditor 附加到编辑器链。但是编辑器链从未设置,并且在ListEditorWrapper 第 95 行抛出了 NPE。
示例
这是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 将使用提及here 的多态编辑器方法。这意味着特定的叶编辑器根据ChildBean.getType() 枚举的值附加到编辑器链。但是,我没有显示该代码,因为我无法正确初始化 GroupListEditor。
【问题讨论】:
-
你能分享你的代码吗?它真的应该像最初看起来一样简单。
-
完成。它被擦洗了一点,根据我在底部的解释,有些部分被遗漏了。
-
究竟是什么问题?你期望什么没有发生? (或者没想到发生了什么)让我们也将 ValueAwareEditor 分开,因为它试图解决您实际上没有描述的问题。
-
组列表编辑器未获取编辑器链。我在
ListEditorWrapper第 95 行得到一个 NPE。我将修改这个问题,使其更具体。过失。 -
这有点模棱两可 :( 它现在应该说明我想要做什么,我打算如何做,我预期会发生什么,以及没有发生什么。
标签: gwt gxt gwt-editors