7 Replies Latest reply on Jul 27, 2009 3:15 PM by Matt Kohanek

    little help on nodeSelectListener for different treeNodes

    Matt Kohanek Novice

      I have a tree that has projects, devices, and channels. I have two beans for this tree, one called DeviceChannels that holds each device and list of its channels, with these variables:

      private String deviceName;
      private String deviceId;
      private String channelId;
      List channelsList = new ArrayList();

      Then I have ProjectHolder class to hold the name of each projects, and a List of this DeviceChannels class. Here are the variables:

      private String projectName;
      private String projectId;
      List deviceAndChannels = new ArrayList();


      In this way I am able to bind only the ProjectHolder class to the rich:tree, but since it has the List of DeviceChannels Objects I am able to get access to both Objects and only having to bind ProjectHolder to the rich:tree.

      I am working on nodeSelectListener methods, but I have trouble with clicking any node other than the top project name node. Clicking that node I can have my code do whatever I need, such as pulling the IDs from that project node and the device cnd channel nodes beneath it.

      But if I try to click on the second or third ndoes, I get these types of errors:

      nodeSelectListener="#{treeClickBean.projectSelection}": java.lang.ClassCastException: nodesContainer.DeviceChannels cannot be cast to nodesContainer.TreeHolder

      Here is the tree as it is now and the projectSelection method that nodeSelectListener calls:




      <rich:tree nodeSelectListener="#{treeClickBean.projectSelection}" ajaxSubmitSelection="true" switchType="client"
       var="item" ajaxKeys="#{null}" reRender="projectForm">
       <rich:treeNodesAdaptor nodes="#{testNodesBean.projects}" var="projects">
       <rich:treeNode>
       <h:outputLink value="/NI/explorer_click/project.jsf">
       <h:outputText value="#{projects.projectName}" />
       </h:outputLink>
       </rich:treeNode>
       <rich:recursiveTreeNodesAdaptor roots="#{projects.deviceAndChannels}" var="device">
       <rich:treeNode>
       <h:outputLink value="/NI/explorer_click/device.jsf">
       <h:outputText value="#{device.deviceName}" />
       </h:outputLink>
       </rich:treeNode>
       <rich:recursiveTreeNodesAdaptor roots="#{device.channelsList}" var="channels">
       <rich:treeNode>
       <h:outputText value="#{channels}" />
       </rich:treeNode>
       </rich:recursiveTreeNodesAdaptor>
       </rich:recursiveTreeNodesAdaptor>
       </rich:treeNodesAdaptor>
       </rich:tree>
      
      
      
      
      
      
      
      
      
      
      public void projectSelection(NodeSelectedEvent event){
       HtmlTree tree = (HtmlTree) event.getComponent();
      
       projectNode = (TreeHolder) tree.getRowData();
       projectId=projectNode.getProjectId();
       projectName=projectNode.getProjectName();
      
       deviceChannelsObject=projectNode.getDeviceAndChannels().get(projectNode.getDeviceindex());
       deviceId=deviceChannelsObject.getDeviceId();
       deviceName=deviceChannelsObject.getDeviceName();
      
      
       }




      As you can see from the java code I can get the data from the child nodes just by clicking on the parent node, but I am having problems adjusting my java code to having the child nodes clicked on.

      Should I make a separate method from projectSelection() or should I handle it in that same class?

      Do I need to put separate nodeSelectListener attributes in the tree? Right now I just have one because calling that gives me access to all the data I need.

      It seems like this should be handled in the java code there, because when I try to add a different nodeSelectListener to the device treeNode tag, it still gives me the same error from above.

      I just need a little guidance on how to handle this.