2012-10-17 26 views
5

Tôi đang sử dụng khung công tác biên tập gwt để liên kết biểu mẫu trong gwt. Tôi đã có thể ràng buộc biểu mẫu thành công, nhưng vấn đề của tôi là tôi cần phải viết quá nhiều mã. Tôi nghĩ việc sử dụng chung sẽ rút ngắn mã của tôi nhưng tôi không thể làm được.áp dụng java generic trong trình soạn thảo gwt

Mã cho EditVendorWorkflow là gần như giống nhau, sự khác biệt duy nhất là hai dòng này

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

Ví dụ, Nếu tôi viết một PersonEditor các EditPersonWorkflow mã tương ứng sẽ có

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

Vì vậy, về cơ bản có một sự lặp lại.

Mọi trợ giúp đều đáng được đánh giá cao.

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

Trả lời

2

Something dọc theo dòng sau đây cần thực hiện công việc:

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

} 

Nhưng thật không may, GWT.create() chỉ có thể chấp nhận một lớp nghĩa đen, mà không thể được chung chung. Vì vậy, tôi đoán bạn vẫn phải tạo ra các giao diện Driver ở đâu đó. Tôi đã thêm một tham số driver-initialize() để bạn có thể gọi GWT.create() bên ngoài và thông qua kết quả trong.

Nếu bạn có một số mã mà cụ thể để Vendor hoặc Person, bạn có thể trừu tượng chúng trong phương pháp trừu tượng như

protected abstract void doSomethingWithEditedObject(O object); 

và triển khai chúng trong các lớp con của EditWorkflow.

Nếu bạn tiếp tục tạo ra các lớp con của EditWorkflow, bạn có thể đặt Driver giao diện bên trong lớp EditWorkflow mình

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

nhờ nó làm việc – user510783

Các vấn đề liên quan