简体   繁体   English

在gwt编辑器中应用java泛型

[英]apply java generic in gwt editor

I am using gwt editor framework to bind form in gwt. 我正在使用gwt编辑器框架来绑定gwt中的表单。 I was able to bind form successfully, but my problem is I need to write too many code. 我能够成功绑定表单,但我的问题是我需要编写太多代码。 I think using generic will shorten my code but I couldn't do it. 我认为使用泛型会缩短我的代码,但我无法做到。

The code for EditVendorWorkflow is almost same, the only difference is this two line EditVendorWorkflow的代码几乎相同,唯一的区别就是这两行

interface Driver extends  SimpleBeanEditorDriver<Vendor, VendorEditor>{}
private VendorEditor editor;

Example, If I write a PersonEditor the corresponding EditPersonWorkflow code will have 例如,如果我编写PersonEditor则相应的EditPersonWorkflow代码将具有

interface Driver extends  SimpleBeanEditorDriver<Person, PersonEditor>{}
private PersonEditor editor;

So basically there is a repetition. 所以基本上有重复。

Any Help is appreciable. 任何帮助都很明显。

public class EditVendorWorkflow{
      interface Driver extends  SimpleBeanEditorDriver<Vendor, VendorEditor>{}

      Driver driver = GWT.create(Driver.class);

      private VendorEditor editor;

      void edit(Vendor p) {
        driver.initialize(editor);
        driver.edit(p);
      }

      void save() {
        Vendor edited = driver.flush();
        //doSomethingWithEditedVendor(edited);

      }

    public void initialize(VendorEditor editor) {
        this.editor = editor;
    }
}


public class VendorEditor extends Composite implements Editor<Vendor> {

    private static VendorEditorUiBinder uiBinder = GWT
            .create(VendorEditorUiBinder.class);
    @UiField Button save;
    @UiField TextBox address;
    @UiField TextBox contactName;
    @UiField ValueBoxEditorDecorator<String> contactMobileNo;
    @Path("department.name")
    @UiField TextBox deptName;
    interface VendorEditorUiBinder extends UiBinder<Widget, VendorEditor> {
    }

    private final EditVendorWorkflow vendorDriver;
    public VendorEditor(Vendor p) {
        initWidget(uiBinder.createAndBindUi(this));
        vendorDriver = GWT.create(EditVendorWorkflow.class);
        vendorDriver.initialize(this);
        vendorDriver.edit(p);
    }


    @UiHandler("save")
    void onSaveClick(ClickEvent event) {
        vendorDriver.save();
    }
}

Something along the following lines should do the job: 以下几行应该做的工作:

public class EditWorkflow<O, E extends Editor<O>> {

    SimpleBeanEditorDriver<O, E> driver; 

    private E editor;

    void edit(O p) {
        driver.initialize(editor);
        driver.edit(p);
    }

    void save() {
        O edited = driver.flush();
        //doSomethingWithEditedObject(edited);
    }

    public void initialize(E editor, SimpleBeanEditorDriver<O, E> driver) {
        this.editor = editor;
        this.driver = driver;
    }

}

But unfortunately, GWT.create() can only accept a class literal, which cannot be generic. 但不幸的是, GWT.create()只能接受一个类文字,它不能是通用的。 So, I guess still you have to create your Driver interfaces somewhere. 所以,我想你仍然需要在某处创建你的Driver接口。 I added a driver parameter to initialize() so that you can call GWT.create() outside and pass the result in. 我在initialize()添加了一个driver参数,以便您可以在外部调用GWT.create()并传递结果。

If you have some codes that specific to Vendor or Person , you can abstract them in abstract methods like 如果您有一些特定于VendorPerson代码,您可以使用抽象方法来抽象它们

protected abstract void doSomethingWithEditedObject(O object); 

and implement them in subclasses of EditWorkflow . 并在EditWorkflow子类中实现它们。

If you go on to create subclasses of EditWorkflow , you can put Driver interfaces inside their respective EditWorkflow class 如果继续创建EditWorkflow子类,可以将Driver接口放在各自的EditWorkflow类中

public class EditVendorWorkflow extends EditWorkflow<Vendor, VendorEditor> {

    interface Driver extends  SimpleBeanEditorDriver<Vendor, VendorEditor>{}

    public void initialize(VendorEditor editor) {
        super.initialize(editor, GWT.create(Driver.class));
    }

    @Override
    protected void doSomethingWithEditedObject(Vendor object) {
        // Code specific to class Vendor...
    }
}

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM