【问题标题】:How to implement GWT Editor with sub-editors如何使用子编辑器实现 GWT 编辑器
【发布时间】:2014-01-16 15:53:32
【问题描述】:

我正在尝试为一个 bean 对象创建一个 GWT 编辑器,它具有另一个对象类型的两个字段,因此我想要这些字段的子编辑器。问题是我对编辑器框架还很陌生,而且我并不真正了解所有这些编辑器接口。 请告知最佳解决方案。我的想法如下:使用子编辑器的驱动程序将数据传递给主编辑器驱动程序;或使用某种 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
    }  
}

}

【问题讨论】:

    标签: java gwt bean-validation gwt-editors


    【解决方案1】:

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

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

    【讨论】:

    • …你不需要BEditor中的EditorDriver
    • 好的,现在我确实填写了 B 字段,尽管它们没有得到验证。如何让 ADriver 收集所有验证错误?
    • 感谢您的回答!我发现了为什么我的验证不起作用 - 我缺少一个 @Valid 注释,用于验证器将字段标记为级联对象。
    【解决方案2】:

    以下是我个人和行业中使用编辑器框架的经验中的一些指南。我已尽力使它们与您的示例相关。

  • 确定您的“顶级”编辑器。在您的情况下,它将是 AEditor - 在大多数其他情况下,它将是一个视图。让指定的小部件实现 Editor 接口,类型 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()
  • 我已经提出了一些要点来演示 LeafValueEditor 和 IsEditor,以防您在更改子编辑器时需要帮助:

    LeafValueEditor

    IsEditor

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-06-01
      • 1970-01-01
      • 1970-01-01
      • 2016-12-13
      • 1970-01-01
      相关资源
      最近更新 更多