2013-05-22 18 views
0

我的问题几乎是相同的,因为这一个: ListEditor with polymorphic types 托马斯有一个很好的答案,但它是不够的我。GWT ListEditor与多态类型 - 无法更新

我想显示可能不同的对象列表,因此每个编辑器可以以不同的方式显示。 它几乎工作,除了我找不到问题:不可能获得当前值并保存它。 (我认为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

我有类似的问题。作为一个建议,试试这个:

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. 
} 

冲洗部件值回豆。编辑器框架应该为您处理其余的问题。

@Override 
public void flush() 
{ 
    //Flush your widget values to the proxy 
    shape.setXXX(...); 
    //... 
} 

我希望它为你工作。它为我做了!