这一节中,我们将会看看TreeTableView的使用。
TreeTableView,顾名思义,就是将TreeView和TableView结合起来的一中控件,能够在TableView中使用树形结构并且与其他Column数据对应。
[title]创建一个TreeTableView[/title]
使用TreeTableView,我们可以通过以下步骤来完成:
- 创建树的子节点
- 创建树的根节点
- 将子节点添加到根节点中
- 创建一个或多个TableView的列
- 定义列的Cell内容
- 创建一个TreeTableView
- 将列应用到TreeTableView中
代码如下:
import javafx.application.Application;
import javafx.beans.property.ReadOnlyStringWrapper;
import javafx.scene.Group;
import javafx.scene.Scene;
import javafx.scene.control.TreeItem;
import javafx.scene.control.TreeTableColumn;
import javafx.scene.control.TreeTableView;
import javafx.stage.Stage;
public class Main extends Application {
    @Override
    public void start(Stage stage) throws Exception{
        stage.setTitle("Tree Table View Samples");
        final Scene scene = new Scene(new Group(), 200, 400);
        Group sceneRoot = (Group)scene.getRoot();
        //创建子节点
        final TreeItem childNode1 = new TreeItem<>("Child Node 1");
        final TreeItem childNode2 = new TreeItem<>("Child Node 2");
        final TreeItem childNode3 = new TreeItem<>("Child Node 3");
        //创建根节点
        final TreeItem root = new TreeItem<>("Root node");
        root.setExpanded(true);
        //将子节点加入到根节点中红
        root.getChildren().setAll(childNode1, childNode2, childNode3);
        //创建一个列
        TreeTableColumn<String,String> column = new TreeTableColumn<>("Column");
        column.setPrefWidth(150);
        //定义列的单元格内容
        column.setCellValueFactory((TreeTableColumn.CellDataFeatures<String, String> p) ->
                new ReadOnlyStringWrapper(p.getValue().getValue()));
        //创建一个TreeTableView
        final TreeTableView treeTableView = new TreeTableView<>(root);
        treeTableView.getColumns().add(column);
        treeTableView.setPrefWidth(152);
        treeTableView.setShowRoot(true);
        sceneRoot.getChildren().add(treeTableView);
        stage.setScene(scene);
        stage.show();
    }
    public static void main(String[] args) {
        launch(args);
    }
}
运行效果如下:

[title]创建多个列[/title]
import javafx.application.Application;
import javafx.beans.property.ReadOnlyStringWrapper;
import javafx.beans.property.SimpleStringProperty;
import javafx.scene.Group;
import javafx.scene.Scene;
import javafx.scene.control.TreeItem;
import javafx.scene.control.TreeTableColumn;
import javafx.scene.control.TreeTableView;
import javafx.scene.image.Image;
import javafx.scene.image.ImageView;
import javafx.scene.paint.Color;
import javafx.stage.Stage;
import java.util.Arrays;
import java.util.List;
public class Main extends Application {
    List files = Arrays.asList(
            new File("123.txt", "1KB"),
            new File("223.txt", "3KB"),
            new File("323.txt", "15KB"),
            new File("423.txt", "12KB"),
            new File("523.txt", "7KB"));
    private final ImageView folderIcon = new ImageView (
            new Image(getClass().getResourceAsStream("folder2.png"))
    );
    final TreeItem root =
            new TreeItem<>(new File("Folder", ""), folderIcon);
    public static void main(String[] args) {
        Application.launch(Main.class, args);
    }
    @Override
    public void start(Stage stage) {
        root.setExpanded(true);
        files.stream().forEach((file) -> {
            ImageView fileIcon = new ImageView (
                    new Image(getClass().getResourceAsStream("file.png")));
            root.getChildren().add(new TreeItem<>(file,fileIcon));
        });
        stage.setTitle("Tree Table View Sample");
        final Scene scene = new Scene(new Group(), 250, 400);
        scene.setFill(Color.LIGHTGRAY);
        Group sceneRoot = (Group) scene.getRoot();
        TreeTableColumn<File, String> fileColumn =
                new TreeTableColumn<>("文件");
        fileColumn.setPrefWidth(140);
        fileColumn.setCellValueFactory(
                (TreeTableColumn.CellDataFeatures<File, String> param) ->
                        new ReadOnlyStringWrapper(param.getValue().getValue().getName())
        );
        TreeTableColumn<File, String> fileSizeColumn =
                new TreeTableColumn<>("文件大小");
        fileSizeColumn.setPrefWidth(110);
        fileSizeColumn.setCellValueFactory(
                (TreeTableColumn.CellDataFeatures<File, String> param) ->
                        new ReadOnlyStringWrapper(param.getValue().getValue().getSize())
        );
        TreeTableView treeTableView = new TreeTableView<>(root);
        treeTableView.getColumns().setAll(fileColumn, fileSizeColumn);
        sceneRoot.getChildren().add(treeTableView);
        stage.setScene(scene);
        stage.show();
    }
    public class File {
        private SimpleStringProperty name;
        private SimpleStringProperty size;
        private File(String name, String size) {
            this.name = new SimpleStringProperty(name);
            this.size = new SimpleStringProperty(size);
        }
        public String getName() {
            return name.get();
        }
        public String getSize() {
            return size.get();
        }
    }
}
在上面的代码中,我们创建了两个列,一个是“文件”列,一个是“文件大小”列,同时创建了一个包含文件和文件大小数据的集合。
然后我们将“文件”列与数据集合中的name关联起来,并且通过如下代码使用CellValueFactory将“文件大小”列与数据集合中的size关联起来。
        fileSizeColumn.setCellValueFactory(
                (TreeTableColumn.CellDataFeatures<File, String> param) ->
                        new ReadOnlyStringWrapper(param.getValue().getValue().getSize())
        );
        fileColumn.setCellValueFactory(
                (TreeTableColumn.CellDataFeatures<File, String> param) ->
                        new ReadOnlyStringWrapper(param.getValue().getValue().getName())
        );
运行效果如下:
[title]未展开时[/title]
[title]展开时[/title]
这样,我们基本知道了TreeTableView是怎么将TreeView和TableView结合起来,并且运行效果是什么样的了。
那么,这一节就到这里了,我们下一节再见。


文章评论