Hi, After searching unsuccessfully through the ML archive, I come here to seek some advice on FormComponentPanels (FCP).
What I want to do is build a small, reusable form component that lets me edit an Address (address, zipCode, city, country). I know that FCP are usually used as a bridge between an external model and a set of individual components ; but in my case, the internal and external models are the same. Below is my current code (adapted from Wicket In Action) ; as you can see, it is very verbose and redundant. public class AddressField extends FormComponentPanel<Address> { > > private Address address = new Address(); > private TextField<String> address1; > private TextField<String> address2; > private TextField<String> zipCode; > private TextField<String> city; > private CountryCodeDropDownChoice countryCode; > > public AddressField(String id) { > super(id); > } > > public AddressField(String id, IModel<Address> model) { > super(id, model); > } > > // Constructor block > { > add(address1 = new TextField<String>("address1", new > PropertyModel<String>(address,"address1"))); > add(address2 = new TextField<String>("address2", new > PropertyModel<String>(address, "address2"))); > add(zipCode = new TextField<String>("zipCode", new > PropertyModel<String>(address, "zipCode"))); > add(city = new TextField<String>("city", new > PropertyModel<String>(address, "city"))); > add((countryCode = new CountryCodeDropDownChoice("countryCode", new > PropertyModel<String>(address, "countryCode"))).setRequired(true)); > } > > @Override > protected void onBeforeRender() { > Address modelAddress = getModelObject(); > if (modelAddress != null) { > address.setAddress1(modelAddress.getAddress1()); > address.setAddress2(modelAddress.getAddress2()); > address.setZipCode(modelAddress.getZipCode()); > address.setCity(modelAddress.getCity()); > address.setCountryCode(modelAddress.getCountryCode()); > } > if (address.getCountryCode() == null) { > address.setCountryCode(CountryUtils.CODE_FRANCE); > } > super.onBeforeRender(); > } > > @Override > protected void convertInput() { > address.setAddress1(address1.getConvertedInput()); > address.setAddress2(address2.getConvertedInput()); > address.setZipCode(zipCode.getConvertedInput()); > address.setCity(city.getConvertedInput()); > address.setCountryCode(countryCode.getConvertedInput()); > setConvertedInput(address); > } > } > What I would like to achieve is something like this, using a CompoundPropertyModel : public class AddressField extends FormComponentPanel<Address> { > > public AddressField(String id) { > this(id, null); > } > > public AddressField(String id, IModel<Address> model) { > super(id, new *CompoundPropertyModel*<Address>(model)); > } > > // Constructor block > { > add(new TextField<String>("address1")); > add(new TextField<String>("address2")); > add(new TextField<String>("zipCode")); > add(new TextField<String>("city")); > add(new > CountryCodeDropDownChoice("countryCode").setRequired(true)); > } > } > But I cannot figure out how to make it work properly (sometimes Wicket tells me that it cannot find a getter, sometimes that it cannot bind to a null model...). I must have missed something obvious ? Thank you for you help ! Olivier