Hi,

id of your TextFields should match name of property in Address model.

something like that..

public class Address {
    private String address1;
    private String address2;
    private String city;

    //getters
    public String getAddress1(){}

    ...
}

Jan Ferko

On 01/20/2011 12:45 PM, Olivier Croisier wrote:
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



---------------------------------------------------------------------
To unsubscribe, e-mail: users-unsubscr...@wicket.apache.org
For additional commands, e-mail: users-h...@wicket.apache.org

Reply via email to