2012-10-17 21 views
5

'da java generic'i uygulayın gwt biçiminde formu bağlamak için gwt düzenleyici çerçevesi kullanıyorum. Formu başarılı bir şekilde bağlayabildim, ama benim sorunum çok fazla kod yazmam gerek. Jenerik kullanmanın kodumu kısaltacağını düşünüyorum ama yapamadım.gwt düzenleyicisi

EditVendorWorkflow için kod tek fark ben PersonEditor yazarsanız

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

Örnek, ilgili EditPersonWorkflow kod Yani temelde var

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

olacak bu iki çizgi, hemen hemen aynıdır bir tekrar.

Herhangi bir Yardım önemlidir. Aşağıdaki satırlar boyunca

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(); 
    } 
} 

cevap

2

şey işini yapmalıdır:

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

} 

Ama ne yazık ki, GWT.create() sadece jenerik olamaz değişmez bir sınıf, kabul edebilir. Yani, hala bir yerde Driver arayüzleri oluşturmanız gerekir. Dışarıda GWT.create() arayıp sonucu geçirebilmesi için ben initialize() bir driver parametresi eklendi.

Bazı kodlar varsa özele Vendor veya Person yapabilirsiniz o

protected abstract void doSomethingWithEditedObject(O object); 
gibi soyut yöntemlerde onları soyut

ve bunları EditWorkflow alt sınıflarına uygulayın. Eğer EditWorkflow alt sınıflarını oluşturmak için devam edersek

, sen kendi EditWorkflow sınıf içinde işe yaradı

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

sayesinde Driver arabirimleri koyabilirsiniz – user510783