heh, seems a lot of people run into it. the short is that you have to do this:
lets say you have a ref to the panel: private Panel panel; what you do is this: panel.replaceWith(new Panel()); and then later again panel.replaceWith(new Panel()); ^ the second time will fail beause you have removed panel from hierarchy already - you replaced it with another panel. the proper way to do it is to keep the reference up to date, so Panel temp=new Panel(); panel.replaceWith(temp); panel=temp; that way when it happens the second time it will properly act on the new panel that is inside the hierarchy now. -igor On 9/9/07, Anthony Schexnaildre <[EMAIL PROTECTED]> wrote: > > I am trying to create a link that will replace one panel with another > on the page. This seems as though it should be an easy task but after > many attempts and searching the net for examples I have yet to get it > working so the replacement can happen more than one without the > component becoming orphaned. On the second replace attempt i get the > following exception. Anyone have the solution? > > Thank you, > > Anthony > > > java.lang.IllegalStateException: This method can only be called on a > component that has already been added to its parent. > at org.apache.wicket.Component.replaceWith(Component.java:2266) > at com.pinwise.pinbase.web.components.links.SecurePanelLink > $4.onClick(SecurePanelLink.java:142) > at org.apache.wicket.markup.html.link.Link.onLinkClicked > (Link.java:222) > at java.lang.reflect.Method.invoke(Method.java:585) > at org.apache.wicket.RequestListenerInterface.invoke > (RequestListenerInterface.java:186) > > > ===================================== > > ===================================== > > public UserPanel(String id) { > super(id); > > > UserFormPanel userFormPanel = new > UserFormPanel("userFormPanel"); > add( userFormPanel ); > > List<IColumn> columns = new ArrayList<IColumn>(); > final Model m = new Model(userFormPanel); > columns.add(new PropertyColumn(new Model("Actions"), "id") > { > public void populateItem(Item cellItem, String > componentId, final > IModel model) > { > EditActionPanel panel = new > EditActionPanel(componentId, model); > panel.add( > SecurePanelLink.createSecurePanelLink( "edit", m, > UserFormPanel.class, model ) ); > cellItem.add( panel ); > } > }); > > columns.add(new PropertyColumn(new Model("Username"), > "username", "username")); > columns.add(new PropertyColumn(new Model("First Name"), > "firstName", "firstName")); > columns.add(new PropertyColumn(new Model("Last Name"), > "lastName", "lastName")); > > add(new DefaultDataTable("table", columns, new > SortableUserDataProvider(), 10)); > } > > > ==================================== > SecurePanelLink > ==================================== > public class SecurePanelLink extends Link implements ISecureComponent { > > /** > * > */ > private static final long serialVersionUID = 1L; > > protected IPanelLink panelLink; > > /** > * @param id > * @param c > */ > public SecurePanelLink(String id, final Class c) > { > super(id); > // Ensure that c is a subclass of Panel > if (!Panel.class.isAssignableFrom(c)) > { > throw new IllegalArgumentException("Class " + c + > " is not a > subclass of Panel"); > } > > this.panelLink = createIPanelLink( id, c ); > setSecurityCheck(new LinkSecurityCheck(this, c)); > } > > public SecurePanelLink(String id, final Class c, Model > existingPanel) > { > super(id); > // Ensure that c is a subclass of Panel > if (!Panel.class.isAssignableFrom(c)) > { > throw new IllegalArgumentException("Class " + c + > " is not a > subclass of Panel"); > } > > this.panelLink = createIPanelLink( id, c ); > setSecurityCheck(new LinkSecurityCheck(this, c)); > } > > private IPanelLink createIPanelLink( String id, final Class c ) { > return new IPanelLink() > { > private static final long serialVersionUID = 1L; > > public Panel getPanel( String id ) > { > // Create panel using panel factory > return getPanelFactory().newPanel(id, c ); > } > > public Panel getPanel( String id, IModel model) > { > // Create panel using panel factory > return getPanelFactory().newPanel(id, c, > model); > } > > public Panel getPanel( Panel panel, IModel model) > { > // Create panel using panel factory > return getPanelFactory().newPanel( > panel.getId(), c, model); > } > > public Class getPanelIdentity() > { > return c; > } > }; > } > > /** > * > */ > public static SecurePanelLink createSecurePanelLink( String id, > Class clazz ) { > return new SecurePanelLink( id, clazz ) { > /** > * > */ > private static final long serialVersionUID = 1L; > > public void onClick() { > Panel panel = ((Panel)findParent( > Panel.class)); > panel.replaceWith( panelLink.getPanel( > panel.getId() ) ); > } > }; > } > > /** > * > */ > public static SecurePanelLink createSecurePanelLink( String id, > Class newPanel, final IModel model ) { > return new SecurePanelLink( id, newPanel ) { > /** > * > */ > private static final long serialVersionUID = 1L; > > public void onClick() { > Panel panel = ((Panel)findParent( > Panel.class)); > panel.replaceWith( panelLink.getPanel( > panel.getId(), model ) ); > } > }; > } > > /** > * > */ > public static SecurePanelLink createSecurePanelLink( String id, > final Model existingPanel, Class newPanel, final IModel model ) { > return new SecurePanelLink( id, newPanel, existingPanel ) > { > /** > * > */ > private static final long serialVersionUID = 1L; > > > public void onClick() { > Panel p = > (Panel)existingPanel.getObject(); > Panel panel = panelLink.getPanel > ((Panel)existingPanel.getObject > (), model ); > panel.setOutputMarkupId(true); > p.getParent().replace( panel ); > p=panel; > } > }; > } >