<p:treetable>重复行</p:treetable>

时间:2013-09-19 15:04:34

标签: jsf primefaces

我有一组与自己有很多关系的类。它们用于维护分层树结构。

我正在尝试使用primefaces的TreeTable组件来显示该层次结构。我通过继承DefaultTreeNode创建了一个TreeNode实现:

@ManagedBean
@SessionScoped
public class TreeNavigationController implements Serializable 
{
    public static class GroupNode extends DefaultTreeNode implements Serializable
    {
    private List<TreeNode> childNodes = null;

    public TickerNode(Object data, TreeNode descriptionNode) {
        super(data, descriptionNode);
    }

    public List<Object> subgroups() {
        // fetch subgroups from backend
        ...
    }

    @Override
        public int getChildCount() {
        return getSubgroups().size();
    }

    @Override
        public List<TreeNode> getChildren() {
        if (childNodes==null) {
        childNodes = new ArrayList<TreeNode>();
        for (TickerGroup g : getSubgroups())
            childNodes.add(new TickerNode(g,this));
        }           
        return childNodes;
    }
    }

    public TreeNavigationController() {
    root = new DefaultTreeNode("root", null);
    // fetch top groups from backend
    List<Object> topGroups = ...
    for (Object g : topGroups) 
        GroupNode gn = new GroupNode(g,root);
    }
}

XHTML很简单:

<p:treeTable id="treetable" value="#{treeNavigationController.root}" var="node" binding="#{treeNavigationController.treeTable}">
    <p:column style="width:32%">
        <h:outputText value="#{node.label}" />
    </p:column>
    <p:column style="width:4%">
        <p:commandLink  title="Klick me" styleClass="ui-icon ui-icon-search">
            <f:setPropertyActionListener value="#{node}" target="#treeNavigationController.selectedGroup}" />
        </p:commandLink>
    </p:column>
</p:treeTable>

所有这些都很有效。当树扩展另一个级别时,将调用getChildren(),依此类推。只有一个故障:所有行(顶行除外)都是重复

我验证了数据源只返回正确的对象一次,而GroupNode对象也只为每个对象创建一次。有什么想法发生了什么?

1 个答案:

答案 0 :(得分:0)

DefaultTreeNode的构造函数已经将节点添加到子节点。也许它可以帮助别人避免同样的麻烦。