2013-02-08 197 views
0

我試圖運行一個編輯與子編輯的例子。 刷新父項時,子編輯器的值爲空。 這些類是Person和Address。 主編輯器是:GWT編輯和副編輯

// 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()始終爲空。 我失蹤了什麼?

回答

1

AddressEditor需求映射到Address模型 - 目前,它似乎沒有,除非Address只有一個的getter/setter,叫getAddress()setAddress(Address),這不會真正使一個很大的意義。

如果您只想要ComboBox<Address>(已實現Editor<Address>),請考慮直接將該組合放入PersonEditor。否則,您需要將@Path("")添加到AddressEditor.address字段,以指示它應該直接編輯該值本身,而不是子屬性(即person.getAddress().getAddress())。

構建地址編輯器的另一種方法是在AddressEditor中列出Address類型的每個屬性。這是默認情況下驅動程序所期待的,所以當它看到一個名爲「地址」的字段時會感到困惑。

關於代碼本身的兩個簡短想法:沒有必要將一個人傳遞給PersonEditor--這是驅動程序本身的工作。其次,您的編輯字段不必是public,他們不能是private

+0

感謝您的回答。我很困惑如何設置子對象。我試圖添加@Path(「」)組合框

地址;但它不起作用。我把所有的東西放在一個班級裏,而且效果很好。再次感謝! – Berna 2013-02-11 13:37:48

+0

@Berna,如果你認爲這是一個有效的答案,你應該接受它通過點擊空的複選標記 – Jonathan 2013-02-12 22:31:53