I would like to be able to create a form where the number and type of form component is decided at run time.
I've done the research and found various guides, e.g http://cwiki.apache.org/WICKET/forms-with-dynamic-elements.html but I've not managed to crack it yet. I've created some panels for the form components, one for a fieldset and one for the form. <wicket:panel> <input type="text" wicket:id="textValue"> </wicket:panel> <wicket:panel> <fieldset> <legend wicket:id="setName">setName</legend> <table> <tr wicket:id="eachEntry"> <td wicket:id="fieldName">fieldName</td> <td wicket:id="fieldValue">fieldValue</td> </tr> </table> </fieldset> </wicket:panel> <wicket:panel> <form wicket:id="SingleItemFormName"> <span wicket:id="SingleItemFormContents"/> </form> </wicket:panel> When I use this final Form form = new Form( "SingleItemFormName" ); for( Iterator views = display.getViews( ).iterator( ); views.hasNext( ); ) { IView view = (IView) views.next( ); form.add( new FieldSetView( "SingleItemFormContents", readonly, display, data, view ) ); } add( form ); it works but only if there is one view. The reason is clear so I thought this is the time to use a ListView. Note that I believe the code above shows that the markup and panels are all working OK but the second time I use the same id it barfs. If I use this final Form form = new Form( "SingleItemFormName" ); ListView contents = new ListView( "SingleItemFormContents", display.getViews( ) ) { protected void populateItem( ListItem item ) { IView view = (IView) item.getModelObject( ); item.add( new FieldSetView( view.getName( ), readonly, display, data, view ) ); } }; contents.setReuseItems( true ); form.add( contents ); add( form ); I get the error that components failed to render. I've also tried final Form form = new Form( "SingleItemFormName" ); add( form ); ListView contents = new ListView( "SingleItemFormContents", display.getViews( ) ) { protected void populateItem( ListItem item ) { IView view = (IView) item.getModelObject( ); item.add( new FieldSetView( view.getName( ), readonly, display, data, view ) ); } }; contents.setReuseItems( true ); add( contents ); form.add( contents ); and even final Form form = new Form( "SingleItemFormName" ); WebMarkupContainer wmc = new WebMarkupContainer( "SingleItemFormContents" ); for( Iterator views = display.getViews( ).iterator( ); views.hasNext( ); ) { IView view = (IView) views.next( ); wmc.add( new FieldSetView( view.getName( ), readonly, display, data, view ) ); } form.add( wmc ); but they all say that components failed to render. What am I missing? Thanks.