2012-10-04 33 views
3

我有一個bean,我使用Model附加到表單上,它工作正常。另外我有一個豆類的領域,如Map<String, javax.mail.Address>。考慮到每個地圖條目應該像Label: TextField一樣,我怎樣才能將這個字段與表單模型綁定?Wicket表單中的多個TextField

在此先感謝。

回答

2

也許是這樣的:

ListView<String> textAreasListView = new ListView<String>("someid", bean.map.keySet()) { 
    @Override 
    protected void populateItem(final ListItem<String> itemLang) { 
     itemLang.add(new Label("label", itemLang.getModelObject())); 
     Model<String> textModel = new Model<String>() { 

      @Override 
      public String getObject() { 
       return bean.map.get(itemLang.getModelObject()).toString; 
      } 

      @Override 
      public void setObject(String object) { 
       bean.map.put(itemLang.getModelObject(), new Address(object)); 
      } 
     }; 
     itemLang.add(new TextField<String>("email", textModel)); 
    } 
}; 

,並添加到您的形式。

地址爲&的自定義轉換器字符串將是一個額外的改進。

+0

非常感謝,它的工作原理) –

+0

我很高興:-);那麼不要忘記接受(並選擇性地提出)答案。 –

1

我想,你可以以這樣的方式將其綁定:

TextField<Address> textField = new TextField<Address>("address", 
     beanModel.<Address> bind("addressMap[addressKey]"), Address.class) { 

    @SuppressWarnings("unchecked") 
    @Override 
    public <C> IConverter<C> getConverter(Class<C> type) { 
     if (Address.class.isAssignableFrom(type)) { 
      return (IConverter<C>) new AddressConverter(); 
     } else { 
      return super.getConverter(type); 
     } 
    } 
}; 
form.add(textField); 

這裏的「addressMap」是地圖領域,「addressKey」的名稱在地圖上的地址值的關鍵。

爲AddressConverter類上市:

public class AddressConverter implements IConverter<Address> { 

    public Address convertToObject(String string, Locale locale) { 
     try { 
      return new InternetAddress(string); 
     } catch (AddressException e) { 
      return null; 
     } 
    } 

    public String convertToString(Address address, Locale locale) { 
     return address.toString(); 
    } 
} 

當然,對於Address類轉換器可在全球範圍內與ConverterLocator連接。只是下面的方法添加到您的應用程序類:

@Override 
protected IConverterLocator newConverterLocator() { 
    ConverterLocator locator = new ConverterLocator(); 
    locator.set(Address.class, new AddressConverter()); 
    return locator; 
} 

然後你不需要重寫getConverter上的所有文本字段()方法。