如何使用子编辑器实现GWT编辑器

时间:2014-01-16 15:53:32

标签: java gwt bean-validation gwt-editors

我正在尝试为bean对象创建一个GWT编辑器,它有两个另一个Object类型的字段,因此我想要这些字段的子编辑器。问题是我对编辑器框架很陌生,而且我并没有真正理解所有那些编辑器接口。 请告知最佳解决方案。我的想法如下:使用子编辑器的驱动程序将数据传递给主编辑器驱动程序;或使用某种CompositeEditor(但我不知道如何处理重写方法......)。 这是一个示例代码:

public class A {

    String s1, s2;
    Integer i;
    Double d;
    B ba, bb;

}

public class B {

    BigDecimal a, b;
}

//sub-editor
public class BEditor extends Composite implements Editor<B> {

    interface BDriver extends BeanEditorDriver<B, BEditor> {
    }

    //implements HasEditorErrors interface
    ValueBoxEditorDecorator<BigDecimal> a, b;
}

//main editor
public class AEditor extends Composite implements Editor<A> {

    interface ADriver extends BeanEditorDriver<A, AEditor> {
    }

    private ADriver driver = GWT.create(ADriver.class);

    ValueBoxEditorDecorator<String> s1, s2;
    ValueBoxEditorDecorator<Integer> i;
    ValueBoxEditorDecorator<Double> d;
    BEditor ba, bb;

    public AEditor() {
        driver.initialize(this);
        driver.edit(new A());
    }

    //called when the editor form is submitted
    public void onSubmit() {

        driver.clearErrors();
        A a = driver.flush();
        // A has both B fields = null
        // AEditor successfully displays validation errors, 
        // but BEditors do not display errors, nor does 
        // ADriver get any errors from BEditor
    }  
}

}

2 个答案:

答案 0 :(得分:1)

创建VehiculeDTO时,还要创建B子类:

A a = new A();
a.setBa(new B());
a.setBb(new B());
driver.edit(a);

答案 1 :(得分:0)

以下是我使用编辑框架的经验,无论是个人还是行业。我尽力使它们与你的榜样相关。

  • 确定您的“顶级”编辑器。在你的情况下,它将是AEditor - 在大多数其他情况下,它将是一个视图。让指定的小部件实现编辑器界面,类型为param =您的后备对象(您已正确完成)。
  • 确保您的支持对象A包含getter和setter,并且字段是私有的。你给他们留下了默认访问权限,我认为这不是一个好主意。
  • 确保您的顶级窗口小部件包含A中每个字段的子编辑器。它们应该与A中的相应字段共享相同的名称,或者使用@Path注释以指示哪个与他们有关的领域。
  • 您的子编辑器永远不应该有自己的驱动程序接口。它们应该实现LeafValueEditor,ValueAwareEditor等或者适配器接口,例如IsEditor
  • 在顶级编辑器的构造函数(此处为AEditor)中,您需要初始化驱动程序和后备对象:
  • ADriver driver =  GWT.create(ADriver.class);
    public AEditor {
        driver.initialize(this);
        driver.edit(new A());
    }
    

  • 保存时,应该调用driver.flush()将数据从顶级编辑器移动到后备对象中。相反,当你加载时,你应该使用你想要加载的支持对象调用driver.edit()
  • 我已经提供了一些Gists来演示LeafValueEditor和IsEditor,以防您需要帮助更改子编辑器:

    LeafValueEditor

    IsEditor