富面临树问题

时间:2010-11-25 11:36:19

标签: java jsf richfaces

请考虑以下富脸树例:

  <rich:tree switchType="ajax">
<rich:treeNodesAdaptor id="officeNodeAdaptor" nodes="#{officesBean.offices}" var="office" >
      <rich:treeNode changeExpandListener="#{office.loadEmplyeesIfNeeded}" >
          <h:outputText value="#{office.name}" />
      </rich:treeNode>
<rich:treeNodesAdaptor id="employeeNodeAdaptor" nodes="#{office.employees}" var="employee">
       <rich:treeNode>
           <h:outputText value="#{employee.name}" />
       </rich:treeNode>
</rich:treeNodesAdaptor>

  

这是用于表示“办公室 - &gt;员工”数据结构的示例树。 我希望以懒惰方式加载emplyees - 所以我介绍了loadEmplyeesIfNeeded扩展监听器。 除了一件事,一切都很好。在扩展office节点之后加载员工..因此,当渲染树时,所有办公室都没有任何员工并且被渲染为叶子..当然叶子也无法扩展....

长期卖空。有没有办法设置节点应该呈现为节点(有可能扩展),尽管没有孩子? 最好的是if rich:treeNode会有一些像isNode那样的属性,但它不会......

b.t.w。我可以通过在办公室初始化时向每个办公室添加一名假员工来解决这个问题。但这不是很好的工作...

提前感谢您的帮助。

2 个答案:

答案 0 :(得分:4)

有点晚了但是。谁知道呢。

你可以像我一样扩展org.richfaces.model.TreeNodeImpl。

   public class RichTreeNodeImpl extends org.richfaces.model.TreeNodeImpl {

       private boolean treatAsNode;

       public boolean getTreatAsNode() {
         return treatAsNode;
       }

       public void setTreatAsNode(boolean treatAsNode) {
         this.treatAsNode = treatAsNode;
       }

       @Override
       public boolean isLeaf() {
           if (this.treatAsNode)
              return false;
           else
              return super.isLeaf();
       }
   }

答案 1 :(得分:2)

如果您不介意在应用程序中添加其他库,可以使用OpenFaces TreeTable执行此操作。只需将preloadedNodes =“none”(或prelodedNodes =“levelsPreloaded:1”)添加到<o:treeTable>标记即可实现延迟加载,并且它还将自动检测是否应显示节点的扩展切换。 OpenFaces TreeTable是可以自定义的,它不一定看起来像一个多列表,但它也可以显示为一个简单的树(例如见this page

以下是如何声明这样的TreeTable(您可能实际上需要更多自定义,但此示例显示了这个想法):

<o:treeTable var="node" preloadedNodes="none">
  <o:dynamicTreStructure nodeChildren="#{treeTableBean.nodeChildren}"/>
  <o:treeColumn>
    <h:outputText value="node.name"/>
  </o:treeColumn>
</o:treeTable>

treeTableBean.nodeChildren方法应该取“node”变量的值,并返回其子节点(如果其值为null,则返回根节点)。以下是此方法在您的情况下的外观:

public List getNodeChildren() {
  Object node = Faces.var("node");
  if (node == null) 
    return getOffices();
  else
    return ((Office) node).getEmployees();
}