2

私は周りを検索して、ポリモーフィック型でエディターフレームワークを使用できるかどうかを調べようとしています。この投稿は、私がやろうとしていることに近い複雑なユースケースでのGWTエディターの使用で見つけました。私はエディターフレームワークにかなり慣れていないので、どんな助けでも大歓迎です。

たとえば、ここにいくつかのコードがあります、

データ転送オブジェクト:

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

これがうまくいくかどうか誰かに教えてもらえますか、私は正しい方向に進んでいますか?

よろしくお願いします、Mac

上記のコードを更新して、ThomasがアドバイスしたContactEditorWrapperクラスが含まれるようにしました。

4

1 に答える 1

0

そのコードは壊れる可能性が高いです。によって返されたエディターEditorSourceがリスト内の別の値の編集に使用されないという保証はありません。

ValueAwareEditor;を使用して、実際のエディターを子エディターとして実装し、ラッパーエディターを作成する必要があります@Path("")。メソッドに適切なものを作成しContactBaseEditorますsetValue

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、実際に使用されている実装に関係なく、からのフィールド/サブエディターのみが編集されることに注意してください。一部のサブクラスに追加のフィールド/サブエディターがある場合は、 andメソッドで手動でContactBaseEditor実装ValueAwareEditorおよび処理する必要があります。setValueflush

于 2012-07-12T11:03:32.860 に答える