我的问题与此问题几乎相同: ListEditor with polymorphic types 托马斯有一个很好的答案,但这对我来说还不够。
我想显示可能是不同的对象列表,因此每个编辑器可以以不同方式显示。 它几乎可以工作,除了我找不到问题:获取当前值并保存它是不可能的。 (我认为必须自动调用setValue方法,但我必须自己调用它)
以下是一些代码:
ShapeListEditor:
public class ShapeListEditor extends VerticalLayoutContainer implements IsEditor<ListEditor<ShapeProxy, ShapeEditorWrapper>> {
public class ESource extends EditorSource<ShapeEditorWrapper> {
@Override
public ShapeEditorWrapper create(int index) {
ShapeEditorWrapper subEditor = new ShapeEditorWrapper(index);
subEditor.setLayoutData(new VerticalLayoutData(1, -1, new Margins(20, 20, 40, 20)));
insert(subEditor, index);
return subEditor;
}
@Override
public void dispose(ShapeEditorWrapper subEditor) {
remove(subEditor);
}
@Override
public void setIndex(ShapeEditorWrapper editor, int index) {
insert(editor, index);
}
}
private ListEditor<ShapeProxy, ShapeEditorWrapper> editor = ListEditor.of(new ESource());
@Override
public ListEditor<ShapeProxy, ShapeEditorWrapper> asEditor() {
return editor;
}
}
ShapeEditorWrapper:
public class ShapeEditorWrapper extends Composite implements ValueAwareEditor<ShapeProxy> {
private SimplePanel panel = new SimplePanel();
@Path("")
ShapeEditor ShapeEditor;
public ShapeEditorWrapper(int index) {
super();
initWidget(panel);
}
@Override
public void setValue(ShapeProxy value) {
if (ShapeEditor == null) {
if (value == null) {
} else if (value.getShapeType() == ShapeTypeEnum.SQUARE) {
ShapeEditor = new ShapeSquareEditor();
ShapeEditor.setValue(value);
panel.setWidget(ShapeEditor);
} else if (value.getShapeType() == ShapeTypeEnum.TRIANGLE) {
ShapeEditor = new ShapeTriangleEditor();
panel.setWidget(ShapeEditor);
}
}
}
}
ShapeEditor:
public class ShapeEditor extends VerticalLayoutContainer implements ValueAwareEditor<ShapeProxy> {
public ShapeEditor() {
super();
}
@Override
public void setValue(ShapeProxy value) {
}
@Override
public void setDelegate(EditorDelegate<ShapeProxy> delegate) {
// TODO Auto-generated method stub
}
@Override
public void flush() {
// TODO Auto-generated method stub
}
@Override
public void onPropertyChange(String... paths) {
// TODO Auto-generated method stub
}
}
ShapeTriangleEditor和ShapeSquareEditor具有相同的属性,但我不希望具有相同的显示。此类重写setValue(),创建并显示具有良好值的字段。但是,如果我更改了值,则不会检测到任何修改。
谁能告诉我我错过了什么?
提前致谢
答案 0 :(得分:0)
我有类似的问题。作为建议,试试这个:
<强> 1。在ShapeEditorWrapper
中您似乎错过了设置ShapeTypeEnum.TRIANGLE的值。
@Override
public void setValue(ShapeProxy value) {
if (shapeEditor == null) {
...
} else if (value.getShapeType() == ShapeTypeEnum.TRIANGLE) {
...
ShapeEditor.setValue(value); // ===> It seems you forgot this.
...
}
}
}
每当刷新包装器时,刷新ShapeEditor。
@Override
public void flush ()
{
shapeEditor.flush();
}
<强> 2。在ShapeEditor,ShapeTriangleEditor和ShapeSquareEditor
中确保setValue()实际更新bean,并在必要时使用bean值初始化任何小部件。
private ShapeProxy shape;
@Override
public void setValue(ShapeProxy value) {
this.shape = value
// intialize your widget fields here.
}
将小部件值刷新回bean。编辑框架应该为您完成剩下的工作。
@Override
public void flush ()
{
//Flush your widget values to the proxy
shape.setXXX(...);
//...
}
我希望它适合你。它为我做了!