1 Reply Latest reply on Mar 12, 2010 9:57 PM by Jim Norman

    ajax richfaces tree problems

    Francis Drake Newbie
      I keep trying to use richfaces tree component with ajax toggle style. I want to build 3 level tree and I managed to, but with two problems.

      1.When I expand nodes on lev1 and lev2 (so the leaves on 3rd lev are displayed) and then I collapse lev1 and then expand again - lev2 shows it is expanded, but no leaves on 3rd lev are displayed - I need to collapse&expand lev2 again.

      2.When I click on 3rd lev leaf (NodeSelectedEvent is raised), collapse lev1, and then try to expand it again I got: java.lang.IllegalStateException: No tree element available or row key not set!

      Please take a look at my code:

      <h:form id="form1">
                <rich:tree style="width:300px" changeExpandListener="#{categoryTree.processToggle}" nodeSelectListener="#{categoryTree.processSelection}"
                  reRender="selectedNode" ajaxSubmitSelection="true" switchType="ajax" id="categoriesTree"
                  value="#{categoryTree.treeNode}" var="item" stateVar="true">
                      <h:outputText value="#{item}" />
              <h:outputText escape="false" value="Selected Node: #{categoryTree.nodeTitle}" id="selectedNode" />

      public class CategoryTree {
           @In(create=true) private Categories categories;
           private Log log = Logging.getLog(CategoryTree.class);
           private CategoryTreeNode rootNode = null;
          private String nodeTitle;
          private Integer selectedCategoryId;
          private CategoryTreeCache cache;
           public CategoryTree() {
                try {
                     cache = CategoryTreeCache.getInstance();
                } catch(Exception ex) {
                     log.error("Can't obtain " + cache.getClass().getName() + " instance", ex);
          private void addNode(TreeNode node, Category category) {       
              CategoryTreeNode nodeImpl = new CategoryTreeNode();
              node.addChild(category.getCategoryId(), nodeImpl);       
          private void addNodes(TreeNode node, Integer parentCategory) {
              List<Category> categoryList = null;
              if(cache.isInCache(parentCategory.toString())) {
                   categoryList = cache.getCategories(parentCategory);
              } else {
                   categoryList = categories.getCategories(parentCategory);
              cache.addCategories(parentCategory, categoryList);
               Iterator<Category> it = categoryList.iterator();         
               while(it.hasNext()) {              
                  addNode(node, it.next());
          public void processSelection(NodeSelectedEvent event) {
              HtmlTree tree = (HtmlTree) event.getComponent();
              nodeTitle = (String)tree.getRowData();
              selectedCategoryId = ((CategoryTreeNode)tree.getModelTreeNode(tree.getRowKey())).getCategoryId();
          public void processToggle(NodeExpandedEvent event) {
               HtmlTree tree = (HtmlTree) event.getComponent();       
              CategoryTreeNode currentNode = (CategoryTreeNode)tree.getModelTreeNode(tree.getRowKey());
                 addNodes(currentNode, currentNode.getCategoryId());
          public CategoryTreeNode getTreeNode() {
              if (rootNode == null) {
                   rootNode = new CategoryTreeNode();
                   rootNode.setData(new Category(0, "Root", -1, (short)0, false));
                   addNodes(rootNode, 0);
              return rootNode;

          public String getNodeTitle() {
              return nodeTitle;

          public void setNodeTitle(String nodeTitle) {
              this.nodeTitle = nodeTitle;
        • 1. Re: ajax richfaces tree problems
          Jim Norman Newbie

          Francis Drake,

          Your post is several months old, so this is probably not helpful to you, but it might be helpful to others:

          Regarding problem 2, the exception is thrown when you call getRowData() in processSelection().  You can catch IllegalStateException there and move on.  This isn't the ultimate solution, but, for me, it's a decent work-around until I can get a deeper understanding.