【问题标题】:ListEditor with polymorphic types具有多态类型的 ListEditor
【发布时间】:2012-07-12 08:45:32
【问题描述】:

我已经四处搜索并试图弄清楚我是否可以将编辑器框架与多态类型一起使用。我在Using GWT Editors with a complex usecase 找到了这篇文章,这与我想要做的很接近。 我对编辑器框架相当陌生,因此非常感谢任何帮助。

例如,这里是一些代码,

数据传输对象:

public class Employee{ 
 public List<Contact> contacts 
}
public class Contact {
public class ContactEmail extends Contact {}
public class ContactAddress extends Contact {}
public class ContactPhoneNumber extends Contact {}

编辑:

public interface ContactBaseEditor<T extends Contact> extends Editor<T> {}
public class AddressEditor extends Composite implements Editor<ContactAddress>, ContactBaseEditor<ContactAddress>{}
public class EmailEditor extends Composite implements Editor<ContactEmail>, ContactBaseEditor<ContactEmail>{)
public class PhoneNumberEditor extends Composite implements Editor<ContactPhoneNumber>, ContactBaseEditor<ContactPhoneNumber>{}

ContactEditor 类:

public class ContactEditor extends Composite implements IsEditor<ListEditor<Contact, ContactEditorWrapper>> {
private class ContactEditorSource extends EditorSource<ContactEditorWrapper> {
    @Override
    public ContactEditorWrapper create(final int index) {
        ContactEditorWrapper contactEditor = new ContactEditorWrapper();
        communicationContactsPanel.add(contactEditor);
        return contactEditor;
    }
    @Override
    public void dispose(ContactEditorWrapper subEditor) {
        subEditor.removeFromParent();   
        }
    @Override
    public void setIndex(ContactEditorWrapper editor, int index) {
        communicationContactsPanel.insert(editor, index);
    }
}

private ListEditor<Contact, ContactEditorWrapper> editor = ListEditor.of(new ContactEditorSource());
public ListEditor<Contact, ContactEditorWrapper> asEditor() {
    return editor;
}
}

ContactEditorWrapper:

class ContactEditorWrapper extends Composite implements ContactBaseEditor<Contact>, ValueAwareEditor<Contact> {

   private SimplePanel panel = new SimplePanel();

   @Path("") ContactBaseEditor<Contact> realEditor;

   public ContactEditor() {
       initWidget(panel);
   }
   @Override
   public void setValue(Contact value) {
      if (value instanceof Address) {
        realEditor = new AddressEditor();
        panel.setWidget((AddressEditor)realEditor);
      }
      else if (value instanceof Email) {
         realEditor = new EmailEditor();
         panel.setWidget((EmailEditor)realEditor);
      }
      else if (value instanceof PhoneNumber) {
         realEditor = new PhoneNumberEditor();
         panel.setWidget((PhoneNumberEditor)realEditor);
      }
      else {
         realEditor = null;
      }
   }
 }

主编辑器类:

public class AddEmployeeEditor extends Composite implements Editor<Employee> {


@UiField
ContactEditor contacts;

interface Driver extends SimpleBeanEditorDriver<Employee, AddEmployeeEditor> {
}  
public AddEmployeeEditor(final Binder binder) {
driver = GWT.create(Driver.class);
    driver.initialize(this);

    List<Contact> list = new ArrayList<Contact>();
    list.add(new Address());
    list.add(new Email());
    list.add(new PhoneNumber());
    list.add(new PhoneNumber());
    Employee employee = new Employee();
    employee.setContacts(list);
    driver.edit(employee);
   }
}

谁能告诉我这是否可行,我是朝着正确的方向前进吗?

提前致谢, 马克

我已经更新了上面的代码,现在包含了 Thomas 建议的 ContactEditorWrapper 类。

【问题讨论】:

    标签: gwt gwt-editors


    【解决方案1】:

    该代码很有可能被破坏:无法保证EditorSource 返回的编辑器不会用于编辑列表中的另一个值。

    您应该创建一个实现ValueAwareEditor 的包装编辑器,并将实际编辑器作为@Path("") 的子编辑器;并在setValue 方法中创建适当的ContactBaseEditor

    class ContactEditor extends Composite implements ValueAwareEditor<Contact> {
    
       private SimplePanel panel = new SimplePanel();
    
       @Path("") ContactBaseEditor realEditor;
    
       public ContactEditor() {
          initWidget(panel);
       }
    
       @Override
       public void setValue(Contact value) {
          if (contact instanceof ContactAddress) {
             realEditor = new AddressEditor();
          }
          else if (contact instanceof ContactEmail) {
             realEditor = new EmailEditor();
          }
          else if (contact instanceof ContactPhoneNumber) {
             realEditor = new PhoneNumberEditor();
          }
          else {
             realEditor = null;
          }
          panel.setWidget(realEditor);
       }
    

    但是请注意,只有来自ContactBaseEditor 的字段/子编辑器将被编辑,无论使用的是哪个实际实现。如果在某些ContactBaseEditor 子类中存在其他字段/子编辑器,则必须实现ValueAwareEditor 并在setValueflush 方法中手动处理。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2017-05-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多