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

Reply via email to