0

サブエディターでエディターの例を実行しようとしています。親をフラッシュするとき、子エディターの値は null です。クラスは 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 です。私は何が欠けていますか?

4

1 に答える 1

1

AddressEditorモデルにマッピングする必要性-現在のところ、 and と呼ばれる getter/setter が 1 つしかAddressない場合を除き、そうではないようです。これはあまり意味がありません。AddressgetAddress()setAddress(Address)

ComboBox<Address>(すでに実装されている)だけが必要な場合はEditor<Address>、そのコンボをPersonEditor直接配置することを検討してください。それ以外の場合は、フィールドに追加@Path("")してAddressEditor.address、サブ プロパティではなく、値自体を直接編集する必要があることを示す必要があります (つまりperson.getAddress().getAddress())。

住所エディタを構築する別の方法はAddressAddressEditor. これは、ドライバーがデフォルトで期待しているものであるため、「アドレス」と呼ばれるフィールドを見ると混乱します。

コード自体に関する 2 つの簡単な考え: 人を渡す必要はありませんPersonEditor。それはドライバー自身の仕事です。次に、エディター フィールドは である必要はありpublicませんprivate

于 2013-02-08T19:07:25.837 に答える