0

私は、それ自体と多対多の関係を持つ一連のクラスを持っています。これらは、階層ツリー構造を維持するために使用されます。

その階層を表示するために、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() が呼び出されます。ヒッチが 1 つだけあります。すべての行 (一番上の行を除く) が複製されます。

データ ソースが正しいオブジェクトを 1 回だけ返し、GroupNode オブジェクトもオブジェクトごとに 1 回しか作成されないことを確認しました。何が起こっているのですか?

4

1 に答える 1