Gwt 具有多态类型的ListEditor

Gwt 具有多态类型的ListEditor,gwt,gwt-editors,Gwt,Gwt Editors,我四处搜索,试图弄清楚是否可以将编辑器框架用于多态类型。我发现这篇文章和我想做的很接近。 我对编辑器框架还比较陌生,因此非常感谢您的帮助 例如,下面是一些代码 数据传输对象: public class Employee{ public List<Contact> contacts } public class Contact { public class ContactEmail extends Contact {} public class ContactAddress ex

我四处搜索,试图弄清楚是否可以将编辑器框架用于多态类型。我发现这篇文章和我想做的很接近。 我对编辑器框架还比较陌生,因此非常感谢您的帮助

例如,下面是一些代码

数据传输对象:

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 {}
公共类雇员{
公开名单联系人
}
公共类联系人{
公共类ContactEmail扩展了联系人{}
公共类ContactAddress扩展了联系人{}
公共类ContactPhoneNumber扩展了联系人{}
编辑:

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>{}
公共接口ContactBaseEditor扩展编辑器{}
公共类AddressEditor扩展复合实现编辑器,ContactBaseEditor{}
公共类EmailEditor扩展复合实现编辑器,ContactBaseEditor{)
公共类PhoneNumberEditor扩展复合实现编辑器,ContactBaseEditor{}
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;
}
}
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);
   }
}
公共类ContactEditor扩展复合实现IsEditor{
私有类ContactEditorSource扩展了EditorSource{
@凌驾
public ContactEditorWrapper创建(最终整数索引){
ContactEditorWrapper contactEditor=新建ContactEditorWrapper();
通讯联系人spanel.add(contactEditor);
返回contactEditor;
}
@凌驾
public void dispose(ContactEditorWrapper子编辑器){
subEditor.removeFromParent();
}
@凌驾
public void setIndex(ContactEditorWrapper编辑器,int index){
通信联系人spanel.insert(编辑器、索引);
}
}
private ListEditor editor=ListEditor.of(new ContactEditorSource());
public ListEditor asEditor(){
返回编辑器;
}
}
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;
      }
   }
 }
类ContactEditorWrapper扩展复合实现ContactBaseEditor、ValueAwareEditor{ 私有SimplePanel=新SimplePanel(); @路径(“”)ContactBaseEditor realEditor; 公共联系人编辑器(){ 初始化小部件(面板); } @凌驾 公共无效设置值(联系人值){ if(地址的值实例){ realEditor=新地址编辑器(); panel.setWidget((AddressEditor)realEditor); } else if(电子邮件的值实例){ realEditor=新的EmailEditor(); setWidget((EmailEditor)realEditor); } else if(电话号码的值实例){ realEditor=新的PhoneNumberEditor(); setWidget((PhoneNumberEditor)realEditor); } 否则{ realEditor=null; } } } 主编辑类:

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;
}
}
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);
   }
}
公共类AddEmployeeEditor扩展复合实现编辑器{
@尤菲尔德
联系人编辑器联系人;
接口驱动程序扩展了SimpleBaneditorDriver{
}  
公共AddEmployeeEditor(最终活页夹){
driver=GWT.create(driver.class);
初始化(这个);
列表=新的ArrayList();
添加(新地址());
添加(新电子邮件());
添加(新电话号码());
添加(新电话号码());
员工=新员工();
employee.setContacts(列表);
驱动程序编辑(员工);
}
}
有谁能告诉我这是否可行,我的方向是否正确

提前感谢,, 苹果


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

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

您应该创建一个包装器编辑器,实现
ValueAwareEditor
,并将实际编辑器作为具有
@Path(“”
)的子编辑器;然后在
setValue
方法中创建相应的
ContactBaseEditor

类ContactEditor扩展复合实现ValueAwareEditor{
私有SimplePanel=新SimplePanel();
@路径(“”)ContactBaseEditor realEditor;
公共联系人编辑器(){
初始化小部件(面板);
}
@凌驾
公共无效设置值(联系人值){
if(联系人地址的联系人实例){
realEditor=新地址编辑器();
}
else if(联系人电子邮件的联系人实例){
realEditor=新的EmailEditor();
}
else if(ContactPhoneNumber的联系人实例){
realEditor=新的PhoneNumberEditor();
}
否则{
realEditor=null;
}
panel.setWidget(realEditor);
}

但是请注意,只有
ContactBaseEditor
中的字段/子编辑器将被编辑,以实际使用的实现为准。如果在某些
ContactBaseEditor
子类中有其他字段/子编辑器,则必须实现
valueawareditor
并在
setValue
中手动处理和
flush
方法。

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

您应该创建一个包装器编辑器,实现
ValueAwareEditor
,并将实际编辑器作为具有
@Path(“”
)的子编辑器;然后在
setValue
方法中创建相应的
ContactBaseEditor

类ContactEditor扩展复合实现ValueAwareEditor{
私有SimplePanel=新SimplePanel();
@路径(“”)ContactBaseEditor realEditor;
公共联系人编辑器(){
初始化小部件(面板);
}
@凌驾
公共无效设置值(联系人值){
if(联系人地址的联系人实例){
realEditor=新地址编辑器();
}
else if(联系人电子邮件的联系人实例){
realEditor=新的EmailEditor();
}
else if(ContactPhoneNumber的联系人实例){
realEditor=新的PhoneNumberEditor();
}
否则{
realEditor=null;
}
panel.setWidget(realEditor);
}
但是请注意,只有