私は、それ自体と多対多の関係を持つ一連のクラスを持っています。これらは、階層ツリー構造を維持するために使用されます。
その階層を表示するために、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 回しか作成されないことを確認しました。何が起こっているのですか?