在Primefaces中对树节点进行排序

nen*_*eni 4 jsf primefaces jsf-2

我正在使用JSF 2.1和Primefaces 3.3.我正在使用primefaces树组件来从数据库中创建树.我想在所有级别按字母顺序对树节点进行排序.请帮帮我.

And*_*ich 6

我们在通过排序时遇到了问题,结果Comparator发现,已经提供了一个方便的PrimeFaces TreeUtils.sortNode(TreeNode,Comparator)它的工作方式就像一个超级魅力:)


map*_*aft 5

您必须DefaultTreeNode使用ManateBean Collections.sort和Comparator类对Primefaces 对象进行排序.

public TreeNodeComparator() implements Comparator<TreeNode> {
  public int compare(TreeNode n1, TreeNode n2) {
    // This assumes the tree node data is a string
    return n1.getData().compareTo(n2.getData());
  }
}
Run Code Online (Sandbox Code Playgroud)

在您的托管bean中,您需要在不添加其父项的情况下组合您的子列表.那可以晚点来.现在,建立你的孩子列出每个级别并设置parentnull;

TreeNode node1 = new DefaultTreeNode("node1", null);
TreeNode node2 = new DefaultTreeNode("node2", null);
TreeNode child1node1 = new DefaultTreeNode("zgnagn", null);
TreeNode child2node1 = new DefaultTreeNode("vvnieeianag", null);
TreeNode child1node2 = new DefaultTreeNode("cajkgnagair", null);
TreeNode child2node2 = new DefaultTreeNode("ajaavnagwokd", null);
rootNodeChildren.add(node1);
rootNodeChildren.add(node2);
node1Children.add(child1node1);
node1Children.add(child2node1);
node2Children.add(child1node2);
node2Children.add(child2node2);
Run Code Online (Sandbox Code Playgroud)

我们将所有内容设置为null的原因是因为当在DefaultTreeNode上设置父项时,它将被添加到父项子列表中.设置节点父节点的顺序决定了它们在树组件中的显示顺序.

知道我们可以使用比较器分别对每个列表进行排序.

Collections.sort(rootNodeChildren, new TreeNodeComparator());
Collections.sort(node1Children, new TreeNodeComparator());
Collections.sort(node2Children, new TreeNodeComparator());
Run Code Online (Sandbox Code Playgroud)

现在所有列表都已排序,因此我们可以一次循环一个适当的父项.您可以编写一个算法来确定这一点,或者您可以保留一个单独的数据结构来构建树层次结构而不添加到列表中.

另一种方式,也可能更简单,就是覆盖DefaultTreeNode类并为其提供一个sort方法:

public SortableDefaultTreeNode extends DefaultTreeNode {

  public void sort() {
    TreeNodeComparator comparator = new TreeNodeComparator();
    Collections.sort(this.children, comparator);
    for (TreeNode child : children) {
      child.sort();
    }
  }
}
Run Code Online (Sandbox Code Playgroud)

现在你只需构建你的TreeNodes然后调用root.sort()它将按字母顺序递归地对每个级别的所有子节点进行排序.