AW: How to switch Panels with a Tree?

2009-04-02 Thread Christian Helmbold

Thank you, Igor. selectedPanel=currentPanel was the solution to my issue.

Regards
Christian






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



How to switch Panels with a Tree?

2009-04-01 Thread Christian Helmbold

Hello,

I want to switch panels with a tree (like switching panels within a 
TabbedPanel), but get an error when clicking more than once on a node.

It should look like this:

+-+
|   (TreePanel)   |
| +-+ |
| |(Tree)   | |
  | * root  |   +---+ |
| | ** Folder A |   |(ContentPanel) | |
| | *** [File1] |   | File1 | |
| | *** File2   |   |   | |
| +-+   +---+ |
+-+

The Panel according to the selected node (File1) is displayed.

The top-level TreePanel contains the Tree and the and the ContentPanel.

Java code of TreePanel:

public class TreePanel extends Panel{

private Tree tree;
private NodePanel selectedPanel;


public TreePanel(String id, NodePanel rootNode)
{
super(id);
DefaultTreeModel treeModel = new 
DefaultTreeModel(rootNode.getAsTreeNode());
selectedPanel = rootNode;

add(selectedPanel);
tree = new Tree(tree, treeModel)
{
@Override
protected String renderNode(TreeNode node)
{
DefaultMutableTreeNode treeNode = (DefaultMutableTreeNode)node;
Object userObject = treeNode.getUserObject();
if (userObject instanceof List)
return subtree;
else
{
NodePanel panel = (NodePanel)userObject;
return panel.getTitle();
}
}

@Override
protected void onNodeLinkClicked(AjaxRequestTarget target,
 javax.swing.tree.TreeNode node)
{
DefaultMutableTreeNode treeNode = (DefaultMutableTreeNode)node;
NodePanel currentPanel = (NodePanel)treeNode.getUserObject();
selectedPanel.replaceWith(currentPanel);
}
};

add(tree);
}

/**
 * Get a reference to the tree to configure or query it.
 * @return
 */
public Tree getTree()
{
return tree;
}

}


In the Page class that uses my TreePanel I add some NodePanls to the tree. When 
I open the Page in the browser, the root panel is displayed as expected. When I 
click on a node the first time everything is fine and the panel gets replaced, 
but when I click on another link I get:

WicketMessage: Method onLinkClicked of interface 
org.apache.wicket.markup.html.link.ILinkListener targeted at component 
[MarkupContainer [Component id = nodeLink]] threw an exception

Root cause:

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:2717)
at 
com.helmbold.wicket.components.tree.TreePanel$1.onNodeLinkClicked(TreePanel.java:53)
...

What's wrong with my code?

Regards
Christian



PS: 

For completeness the code of NodePanel (ContentPanel in the example extends 
NodePanel):

public abstract class NodePanel extends Panel{

private DefaultMutableTreeNode treeNode = new DefaultMutableTreeNode(this);


/**
 * Constructs a NodePanel with the given id.
 * @param id wicket:id
 */
public NodePanel(String id)
{
super(id);
}


/**
 * Wraps this object in a DefaultMutableTreeNode.
 * @return A DefaultMutableTreeNode object which returns this object when
 * DefaultMutableTreeNode#getUserObject() is invoked.
 */
public DefaultMutableTreeNode getAsTreeNode()
{
return treeNode;
}


/**
 * Add a child in the tree hierarchy - not a nested panel this a panel!
 * @param child
 */
public void addChild(NodePanel child)
{
treeNode.add(child.getAsTreeNode());
}


/**
 * @return Title of the Panel that will be displayed as node link in the 
tree.
 */
public abstract String getTitle();

}







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



Re: How to switch Panels with a Tree?

2009-04-01 Thread Matej Knopp
Hi,

  selectedPanel.replaceWith(currentPanel);

 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:2717)

Obviously your selected panel is not added to page and you try to call
replaceWith on it.

-Matej

On Wed, Apr 1, 2009 at 2:58 PM, Christian Helmbold
christian.helmb...@yahoo.de wrote:

 Hello,

 I want to switch panels with a tree (like switching panels within a 
 TabbedPanel), but get an error when clicking more than once on a node.

 It should look like this:

 +-+
 |               (TreePanel)                   |
 | +-+                             |
 | |    (Tree)   |                             |
  | * root      |   +---+ |
 | | ** Folder A |   |    (ContentPanel)     | |
 | | *** [File1] |   | File1                 | |
 | | *** File2   |   |                       | |
 | +-+   +---+ |
 +-+

 The Panel according to the selected node (File1) is displayed.

 The top-level TreePanel contains the Tree and the and the ContentPanel.

 Java code of TreePanel:
 
 public class TreePanel extends Panel{

    private Tree tree;
    private NodePanel selectedPanel;


    public TreePanel(String id, NodePanel rootNode)
    {
        super(id);
        DefaultTreeModel treeModel = new 
 DefaultTreeModel(rootNode.getAsTreeNode());
        selectedPanel = rootNode;

        add(selectedPanel);
        tree = new Tree(tree, treeModel)
        {
           �...@override
            protected String renderNode(TreeNode node)
            {
                DefaultMutableTreeNode treeNode = (DefaultMutableTreeNode)node;
                Object userObject = treeNode.getUserObject();
                if (userObject instanceof List)
                    return subtree;
                else
                {
                    NodePanel panel = (NodePanel)userObject;
                    return panel.getTitle();
                }
            }

           �...@override
            protected void onNodeLinkClicked(AjaxRequestTarget target,
                                 javax.swing.tree.TreeNode node)
            {
                DefaultMutableTreeNode treeNode = (DefaultMutableTreeNode)node;
                NodePanel currentPanel = (NodePanel)treeNode.getUserObject();
                selectedPanel.replaceWith(currentPanel);
            }
        };

        add(tree);
    }

    /**
     * Get a reference to the tree to configure or query it.
     * @return
     */
    public Tree getTree()
    {
        return tree;
    }

 }
 

 In the Page class that uses my TreePanel I add some NodePanls to the tree. 
 When I open the Page in the browser, the root panel is displayed as expected. 
 When I click on a node the first time everything is fine and the panel gets 
 replaced, but when I click on another link I get:

 WicketMessage: Method onLinkClicked of interface 
 org.apache.wicket.markup.html.link.ILinkListener targeted at component 
 [MarkupContainer [Component id = nodeLink]] threw an exception

 Root cause:

 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:2717)
 at 
 com.helmbold.wicket.components.tree.TreePanel$1.onNodeLinkClicked(TreePanel.java:53)
 ...

 What's wrong with my code?

 Regards
 Christian



 PS:

 For completeness the code of NodePanel (ContentPanel in the example extends 
 NodePanel):
 
 public abstract class NodePanel extends Panel{

    private DefaultMutableTreeNode treeNode = new DefaultMutableTreeNode(this);


    /**
     * Constructs a NodePanel with the given id.
     * @param id wicket:id
     */
    public NodePanel(String id)
    {
        super(id);
    }


    /**
     * Wraps this object in a DefaultMutableTreeNode.
     * @return A DefaultMutableTreeNode object which returns this object when
     * DefaultMutableTreeNode#getUserObject() is invoked.
     */
    public DefaultMutableTreeNode getAsTreeNode()
    {
        return treeNode;
    }


    /**
     * Add a child in the tree hierarchy - not a nested panel this a panel!
     * @param child
     */
    public void addChild(NodePanel child)
    {
        treeNode.add(child.getAsTreeNode());
    }


    /**
     * @return Title of the Panel that will be displayed as node link in the 
 tree.
     */
    public abstract String getTitle();

 }
 






 

Re: How to switch Panels with a Tree?

2009-04-01 Thread Igor Vaynberg
selectedPanel.replaceWith(currentPanel);
selectedPanel=currentPanel;

-igor

On Wed, Apr 1, 2009 at 5:58 AM, Christian Helmbold
christian.helmb...@yahoo.de wrote:

 Hello,

 I want to switch panels with a tree (like switching panels within a 
 TabbedPanel), but get an error when clicking more than once on a node.

 It should look like this:

 +-+
 |               (TreePanel)                   |
 | +-+                             |
 | |    (Tree)   |                             |
  | * root      |   +---+ |
 | | ** Folder A |   |    (ContentPanel)     | |
 | | *** [File1] |   | File1                 | |
 | | *** File2   |   |                       | |
 | +-+   +---+ |
 +-+

 The Panel according to the selected node (File1) is displayed.

 The top-level TreePanel contains the Tree and the and the ContentPanel.

 Java code of TreePanel:
 
 public class TreePanel extends Panel{

    private Tree tree;
    private NodePanel selectedPanel;


    public TreePanel(String id, NodePanel rootNode)
    {
        super(id);
        DefaultTreeModel treeModel = new 
 DefaultTreeModel(rootNode.getAsTreeNode());
        selectedPanel = rootNode;

        add(selectedPanel);
        tree = new Tree(tree, treeModel)
        {
           �...@override
            protected String renderNode(TreeNode node)
            {
                DefaultMutableTreeNode treeNode = (DefaultMutableTreeNode)node;
                Object userObject = treeNode.getUserObject();
                if (userObject instanceof List)
                    return subtree;
                else
                {
                    NodePanel panel = (NodePanel)userObject;
                    return panel.getTitle();
                }
            }

           �...@override
            protected void onNodeLinkClicked(AjaxRequestTarget target,
                                 javax.swing.tree.TreeNode node)
            {
                DefaultMutableTreeNode treeNode = (DefaultMutableTreeNode)node;
                NodePanel currentPanel = (NodePanel)treeNode.getUserObject();
                selectedPanel.replaceWith(currentPanel);
            }
        };

        add(tree);
    }

    /**
     * Get a reference to the tree to configure or query it.
     * @return
     */
    public Tree getTree()
    {
        return tree;
    }

 }
 

 In the Page class that uses my TreePanel I add some NodePanls to the tree. 
 When I open the Page in the browser, the root panel is displayed as expected. 
 When I click on a node the first time everything is fine and the panel gets 
 replaced, but when I click on another link I get:

 WicketMessage: Method onLinkClicked of interface 
 org.apache.wicket.markup.html.link.ILinkListener targeted at component 
 [MarkupContainer [Component id = nodeLink]] threw an exception

 Root cause:

 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:2717)
 at 
 com.helmbold.wicket.components.tree.TreePanel$1.onNodeLinkClicked(TreePanel.java:53)
 ...

 What's wrong with my code?

 Regards
 Christian



 PS:

 For completeness the code of NodePanel (ContentPanel in the example extends 
 NodePanel):
 
 public abstract class NodePanel extends Panel{

    private DefaultMutableTreeNode treeNode = new DefaultMutableTreeNode(this);


    /**
     * Constructs a NodePanel with the given id.
     * @param id wicket:id
     */
    public NodePanel(String id)
    {
        super(id);
    }


    /**
     * Wraps this object in a DefaultMutableTreeNode.
     * @return A DefaultMutableTreeNode object which returns this object when
     * DefaultMutableTreeNode#getUserObject() is invoked.
     */
    public DefaultMutableTreeNode getAsTreeNode()
    {
        return treeNode;
    }


    /**
     * Add a child in the tree hierarchy - not a nested panel this a panel!
     * @param child
     */
    public void addChild(NodePanel child)
    {
        treeNode.add(child.getAsTreeNode());
    }


    /**
     * @return Title of the Panel that will be displayed as node link in the 
 tree.
     */
    public abstract String getTitle();

 }
 






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



-
To unsubscribe, e-mail: