我有一个非常简单的 TreeView 示例。
import javafx.application.Application;
import javafx.beans.property.ReadOnlyStringWrapper;
import javafx.scene.Group;
import javafx.scene.Scene;
import javafx.scene.control.TreeTableColumn;
import javafx.scene.control.TreeTableColumn.CellDataFeatures;
import javafx.scene.control.TreeItem;
import javafx.scene.control.TreeTableView;
import javafx.stage.Stage;
public class TreeTableViewSample extends Application {
public static void main(String[] args) {
Application.launch(args);
}
@Override
public void start(Stage stage) {
stage.setTitle("Tree Table View Samples");
final Scene scene = new Scene(new Group(), 200, 400);
Group sceneRoot = (Group)scene.getRoot();
//Creating tree items
final TreeItem<String> childNode1 = new TreeItem<>("Child Node 1");
final TreeItem<String> childNode2 = new TreeItem<>("Child Node 2");
final TreeItem<String> childNode3 = new TreeItem<>("Child Node 3");
//Creating the root element
final TreeItem<String> root = new TreeItem<>("Root node");
root.setExpanded(true);
//Adding tree items to the root
root.getChildren().setAll(childNode1, childNode2, childNode3);
//Creating a column
TreeTableColumn<String,String> column = new TreeTableColumn<>("Column");
column.setPrefWidth(150);
//Defining cell content
column.setCellValueFactory((CellDataFeatures<String, String> p) ->
new ReadOnlyStringWrapper(p.getValue().getValue()));
//Creating a tree table view
final TreeTableView<String> treeTableView = new TreeTableView<>(root);
treeTableView.getColumns().add(column);
treeTableView.setPrefWidth(152);
treeTableView.setShowRoot(true);
sceneRoot.getChildren().add(treeTableView);
stage.setScene(scene);
stage.show();
}
}
我感兴趣如何按名称对树节点进行排序?
此功能是否已在 JavaFX 中实现,或者我需要实现自定义树单元?
有什么我可以使用的例子吗?
默认情况下,只需单击其标题一次或两次即可对每个
TableColumn
上的项目进行排序,以获得默认排序顺序(默认升序或降序)。
默认比较器是
String.compareTo
,它按字典顺序比较两个字符串。
但是你可以实现你自己的。例如,这将按字符串的长度排序:
// compare by length of the strings
column.setComparator(Comparator.comparing(String::length));
这个将首先按长度排序,然后在长度相等的情况下按名称排序:
// compare by length first, and then lexicographically
column.setComparator(Comparator.comparing(String::length).thenComparing(String::compareTo));
编辑:由于示例引用了
TreeTableView
,但OP要求TreeView
,因此这就是项目的排序方式:
1)由于我们要添加项目集合,因此我们可以在将子项添加到根之前对其进行排序
@Override
public void start(Stage stage) {
stage.setTitle("Tree Table View Samples");
final Scene scene = new Scene(new Group(), 200, 400);
Group sceneRoot = (Group)scene.getRoot();
//Creating tree items
final TreeItem<String> childNode1 = new TreeItem<>("Child Node 10");
final TreeItem<String> childNode2 = new TreeItem<>("Child Node Two");
final TreeItem<String> childNode3 = new TreeItem<>("Child Node 3");
//Creating the root element
final TreeItem<String> root = new TreeItem<>("Root node");
root.setExpanded(true);
List<TreeItem<String>> list = Arrays.asList(childNode1, childNode2, childNode3);
// sort by length of the item's names
list.sort(Comparator.comparing(t->t.getValue().length()));
//Adding tree items to the root
root.getChildren().setAll(list);
TreeView<String> tree = new TreeView<> (root);
sceneRoot.getChildren().add(tree);
stage.setScene(scene);
stage.show();
}
2)将项目添加到根后,我们可以为根提供
Comparator
:
@Override
public void start(Stage stage) {
stage.setTitle("Tree Table View Samples");
final Scene scene = new Scene(new Group(), 200, 400);
Group sceneRoot = (Group)scene.getRoot();
//Creating tree items
final TreeItem<String> childNode1 = new TreeItem<>("Child Node 10");
final TreeItem<String> childNode2 = new TreeItem<>("Child Node Two");
final TreeItem<String> childNode3 = new TreeItem<>("Child Node 3");
//Creating the root element
final TreeItem<String> root = new TreeItem<>("Root node");
root.setExpanded(true);
//Adding tree items to the root
root.getChildren().setAll(childNode1, childNode2, childNode3);
TreeView<String> tree = new TreeView<> (root);
// sort by length of the item's names
root.getChildren().sort(Comparator.comparing(t->t.getValue().length()));
sceneRoot.getChildren().add(tree);
stage.setScene(scene);
stage.show();
}
我对此发表评论是为了防止其他人正在寻求有关如何对 JavaFX TreeView 进行排序的建议。不要执行 J Pereda 建议的选项 2)。在过去的两年里,我断断续续地尝试跟踪我们项目中 TreeView 中的奇怪行为,这一切都取决于树构建后在 TreeView 上应用排序。在某些情况下,结果是树项目空白,您看不到分配的项目图形,而在其他情况下,整个树消失了,而在其他情况下,就好像比较器不起作用或您错误地操作了开发了一个比较器。最终,正是树的错误排序导致我发现缺陷在于 2)。
因此,我的建议是首先对树列表进行排序,然后构建树,并且永远不要对树应用后续排序,而是对原始列表重新排序,清除树并重新构建。
我再说一遍:不要做选项 2)。它可能适用于只有几个项目且没有图形的树,但它不适用于现实世界中的树,其中数十个项目分为几个组,每个组都有自己的图形。