Javafx 按名称对TreeView排序

Javafx 按名称对TreeView排序,javafx,javafx-2,javafx-8,Javafx,Javafx 2,Javafx 8,我有一个非常简单的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.TreeTableCol

我有一个非常简单的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.application.application;
导入javafx.beans.property.ReadOnlyStringWrapper;
导入javafx.scene.Group;
导入javafx.scene.scene;
导入javafx.scene.control.TreeTableColumn;
导入javafx.scene.control.TreeTableColumn.CellDataFeatures;
导入javafx.scene.control.TreeItem;
导入javafx.scene.control.TreeTableView;
导入javafx.stage.stage;
公共类TreeTableViewSample扩展了应用程序{
公共静态void main(字符串[]args){
应用程序启动(args);
}
@凌驾
公众假期开始(阶段){
stage.setTitle(“树表视图样本”);
最终场景=新场景(新组(),200400);
组sceneRoot=(组)scene.getRoot();
//创建树项目
final TreeItem childNode1=新TreeItem(“子节点1”);
final TreeItem childNode2=新TreeItem(“子节点2”);
final TreeItem childNode3=新TreeItem(“子节点3”);
//创建根元素
最终树项根=新树项(“根节点”);
root.setExpanded(true);
//将树项目添加到根目录
root.getChildren().setAll(childNode1、childNode2、childNode3);
//创建列
TreeTableColumn=新的TreeTableColumn(“列”);
列宽(150);
//定义单元格内容
column.setCellValueFactory((CellDataFeatures p)->
新的ReadOnlyStringWrapper(p.getValue().getValue());
//创建树表视图
最终树视图树视图=新树视图(根);
treeTableView.getColumns().add(列);
treeTableView.setPrefWidth(152);
treeTableView.setShowRoot(true);
sceneRoot.getChildren().add(treeTableView);
舞台场景;
stage.show();
}     
}
我感兴趣的是如何按名称对树节点进行排序

这个功能是否已经在JavaFX中实现了,或者我需要实现自定义树单元


是否有我可以使用的示例?

默认情况下,每个
表格列
上的项目只需单击其标题一次或两次,即可进行排序,以获得默认排序顺序(默认为升序或降序)

默认的比较器是
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));
编辑:由于示例引用的是一个
树视图
,但OP要求一个
树视图
,因此项目可以这样排序:

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();        
}
@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();        
}