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;
> }
> };
> }
>