GWT-редакторы и субредакторы

Я пытаюсь запустить пример редакторов с подредакторами. При сбросе родителя значение дочернего редактора равно нулю. Это классы Person и Address. Главный редактор это:

    // editor fields
public TextField firstname;
public TextField lastname;
public NumberField<Integer> id;

public AddressEditor address = new AddressEditor();

public PersonEditor(Person p){
    asWidget();
}

@Override
public Widget asWidget() {
    setWidth(400);
    setBodyStyle("padding: 5px;");
    setHeaderVisible(false);

    VerticalLayoutContainer c = new VerticalLayoutContainer();

    id = new NumberField<Integer>(new IntegerPropertyEditor());
    // id.setName("id");
    id.setFormat(NumberFormat.getFormat("0.00"));
    id.setAllowNegative(false);
    c.add(new FieldLabel(id, "id"), new VerticalLayoutData(1, -1));

    firstname = new TextField();
    // firstname.setName("firstname");
    c.add(new FieldLabel(firstname, "firstname"), new VerticalLayoutData(1, -1));

    lastname = new TextField();
    lastname.setName("lastname");
    c.add(new FieldLabel(lastname, "lastname"), new VerticalLayoutData(1, -1));

    c.add(address);
    add(c);
    return this;

Подредактор:

public class AddressEditor extends Composite implements Editor<Address> {

private AddressProperties props = GWT.create(AddressProperties.class);
private ListStore<Address> store = new ListStore<Address>(props.key());
ComboBox<Address> address;

public AddressEditor() {
    for(int i = 0; i < 5; i ++)
        store.add(new Address("city" + i));
    address = new ComboBox<Address>(store, props.nameLabel());

    address.setAllowBlank(false);
    address.setForceSelection(true);
    address.setTriggerAction(TriggerAction.ALL);
    initWidget(address);
}

И здесь создается драйвер:

private HorizontalPanel hp;

private Person googleContact;
PersonDriver driver = GWT.create(PersonDriver.class);

public void onModuleLoad() {

    hp = new HorizontalPanel();
    hp.setSpacing(10);

    googleContact = new Person();
    PersonEditor pe = new PersonEditor(googleContact);

    driver.initialize(pe);
    driver.edit(googleContact);

    TextButton save = new TextButton("Save");
    save.addSelectHandler(new SelectHandler() {

        @Override
        public void onSelect(SelectEvent event) {
            googleContact = driver.flush();
            System.out.println(googleContact.getFirstname() + ", " + googleContact.getAddress().getCity());
            if (driver.hasErrors()) {
                new MessageBox("Please correct the errors before saving.").show();
                return;
            }
        }
    });

Значение googleContact.getFirstname() заполнено, но googleContact.getAddress() всегда равно null. Что мне не хватает?


person Berna    schedule 08.02.2013    source источник


Ответы (1)


Модель AddressEditor должна сопоставляться с моделью Address - в настоящее время это не так, если только Address не имеет только одного метода получения/установки, называемого getAddress() и setAddress(Address), что на самом деле не имеет большого смысла.

Если вам нужен только ComboBox<Address> (который уже реализует Editor<Address>), подумайте о том, чтобы поместить эту комбинацию непосредственно в PersonEditor. В противном случае вам нужно будет добавить @Path("") в поле AddressEditor.address, чтобы указать, что оно должно редактировать непосредственно само значение, а не подсвойство (например, person.getAddress().getAddress()).

Другой способ создать редактор адресов — перечислить каждое из свойств типа Address в файле AddressEditor. Это то, что драйвер ожидает по умолчанию, поэтому он сбит с толку, увидев поле под названием «адрес».

Две краткие мысли о самом коде: нет необходимости передавать человека в PersonEditor - это работа самого водителя. Во-вторых, поля вашего редактора не обязательно должны быть public, они просто не могут быть private.

person Colin Alworth    schedule 08.02.2013
comment
Спасибо за ответ. Я немного запутался, как настроить подобъект. Я попытался добавить адрес @Path() ComboBox‹Address›; но это не сработало. Я поместил все в один класс, и это сработало отлично. Еще раз спасибо! - person Berna; 11.02.2013
comment
@ Берна, если вы считаете, что это правильный ответ, вы должны принять его, нажав на пустую галочку. - person Jonathan; 13.02.2013