原文地址:DOC-03-15 树表视图(Tree Table View) | JavaFX中文资料
TreeTableView控件与TreeView和TableView控件有很多类似之处,并且在各个方面扩展了它们的功能
创建一个TreeTableView 控件
在你的程序中实现一个基本的TreeTableView组件可以按如下步骤进行:
1. 创建树节点
2. 创建根元素
3. 添加树节点到根元素下
4. 创建一个或多个列
5. 定义单元格内容
6. 创建一个树表视图
7. 向树表视图分配列
在一些情况下,你可以省略或隐藏根元素。在下面的例子中按上述步骤创建了一个简单的树表视图控件
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 TreeTableViewTest extends Application { public static void main(String[] args) { Application.launch(args); } @Override public void start(Stage stage) { stage.setTitle("TreeTableViewTest"); final Scene scene = new Scene(new Group(), 500, 400);//创建场景并加载节点容器组 Group sceneRoot = (Group)scene.getRoot();//获取节点容器组对象 //Creating tree items final TreeItem<String> childNode1 = new TreeItem<>("选项节点1");//创建树形结构选项组件 final TreeItem<String> childNode2 = new TreeItem<>("选项节点2");//创建树形结构选项组件 final TreeItem<String> childNode3 = new TreeItem<>("选项节点3");//创建树形结构选项组件 //Creating the root element final TreeItem<String> root = new TreeItem<>("根节点"); root.setExpanded(true);//默认设置根节点可展开 //Adding tree items to the root root.getChildren().setAll(childNode1, childNode2, childNode3);//根节点添加3个叶子节点 //Creating a column TreeTableColumn<String,String> column = new TreeTableColumn<>("列名");//创建一个表格列 column.setPrefWidth(150);//列宽设置 //Defining cell content column.setCellValueFactory((CellDataFeatures<String, String> p) -> new ReadOnlyStringWrapper(p.getValue().getValue()));//定义所选cell组件的内容格式 //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();//舞台展现 } }
在上面的例子中在一列里创建了一个简单的树视图组件,然而在你的应用程序中经常会操作进行了更多扩展的数据集
它为两个表列创建了Cell Factory。setCellValueFactory方法为每个表列定义了TreeItem的内容,因此Employee列包含了Employee.name属性值,而Email列包含了Employee.email属性值
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; /** * @author zhaoyong * @Date 2022/1/21 * @Description */ public class TreeTableViewSample extends Application { List<Employee> employees = Arrays.<Employee>asList(//创建雇员实体对象集合 new Employee("Ethan Williams", "ethan.williams@example.com"), new Employee("Emma Jones", "emma.jones@example.com"), new Employee("Michael Brown", "michael.brown@example.com"), new Employee("Anna Black", "anna.black@example.com"), new Employee("Rodger York", "roger.york@example.com"), new Employee("Susan Collins", "susan.collins@example.com")); private final ImageView depIcon = new ImageView ( new Image(getClass().getResourceAsStream("folder_16.jpg")) );//创建一个图片视图区域组件 final TreeItem<Employee> root = new TreeItem<>(new Employee("人员", "邮箱"), depIcon);//创建树形结构根节点选项 public static void main(String[] args) { Application.launch(TreeTableViewSample.class, args); } @Override public void start(Stage stage) { root.setExpanded(true);//设置根节点展开 employees.stream().forEach((employee) -> { root.getChildren().add(new TreeItem<>(employee));//将员工信息添加到树形选择项中,并将树形选项添加到树根节点中 }); stage.setTitle("树形表格"); final Scene scene = new Scene(new Group(), 400, 400);//场景大小 scene.setFill(Color.LIGHTGRAY);//背景颜色 Group sceneRoot = (Group) scene.getRoot();//场景上的节点组对象的获取 TreeTableColumn<Employee, String> empColumn = new TreeTableColumn<>("列1");//树形表格列名定义 empColumn.setPrefWidth(150);//列宽设置 empColumn.setCellValueFactory( (TreeTableColumn.CellDataFeatures<Employee, String> param) -> new ReadOnlyStringWrapper(param.getValue().getValue().getName()) );//设置列单元格的格式和取值规则 TreeTableColumn<Employee, String> emailColumn = new TreeTableColumn<>("列2"); emailColumn.setPrefWidth(190); emailColumn.setCellValueFactory( (TreeTableColumn.CellDataFeatures<Employee, String> param) -> new ReadOnlyStringWrapper(param.getValue().getValue().getEmail()) );//设置列单元格的格式和取值规则 TreeTableView<Employee> treeTableView = new TreeTableView<>(root);//创建树表并添加根节点 treeTableView.getColumns().setAll(empColumn, emailColumn);//树表中添加列 sceneRoot.getChildren().add(treeTableView);//根节点容器添加树表 stage.setScene(scene);//舞台设置场景 stage.show();//舞台展现 } public class Employee {//domain POJO 类型定义 private SimpleStringProperty name; private SimpleStringProperty email; public SimpleStringProperty nameProperty() { if (name == null) { name = new SimpleStringProperty(this, "name"); } return name; } public SimpleStringProperty emailProperty() { if (email == null) { email = new SimpleStringProperty(this, "email"); } return email; } private Employee(String name, String email) { this.name = new SimpleStringProperty(name); this.email = new SimpleStringProperty(email); } public String getName() { return name.get(); } public void setName(String fName) { name.set(fName); } public String getEmail() { return email.get(); } public void setEmail(String fName) { email.set(fName); } } } ____________________________________________
树表的默认样式将会强制展开所有的树节点和所有的表列。然而,你可以通过使用TreeTableView和TreeTableColumn类对应的方法或属性来改变这些默认值
改变视觉样式
你可以启用展示菜单按钮,这样用户可以定义表列的可见性。调用treeTableView对象的treeTableView.setTableMenuButtonVisible(true)方法,此方法将会在表头上填加一个“+”按钮
你可以通过调用TreeTableView类的setShowRoot(…)方法来控制根节点是否可见,例如:treeTableView.setShowRoot(false);。图15-5是调用时传入参数值为false后隐藏了根节点后效果:
你可以通过点击列头来对列中的数据排序,并可以切换排序模式为升序或降序。除了内置的对排序的支持,还可以参考下面的样例代码通过设置TreeTableColumn和TreeTableView的属性来控制数据排序。
排序模式设置
1
2
3
4
5
6
7
8
|
//Setting the descending mode of sorting for the Email column
emailColumn.setSortType(TreeTableColumn.SortType.DESCENDING);
//Setting the ascending mode of sorting for the Email column
emailColumn.setSortType(TreeTableColumn.SortType.ASCENDING);
//Applying the sorting mode to all tree items
treeTableView.setSortMode(TreeSortMode.ALL_DESCENDANTS);
//Applying the sorting mode only to the first-level nodes
treeTableView.setSortMode(TreeSortMode.ONLY_FIRST_LEVEL);
|
管理选择模式
TreeTableView类中默认实现的选择模式是在MultipleSelectionModel抽象类中定义的,它设置默认值为SelectionMode.SINGLE。使用setSelectionModel和setCellSelectionEnabled方法可以启用对树节点和单元格的多选功能。
选择模式设置
setSelectionModel | setCellSelectionEnabled | Behavior |
SelectionMode.SINGLE | false | 可对表格中的一行单选 |
SelectionMode.SINGLE | true | 可对表格中的单个单元格进行单选 |
SelectionMode.MULTUPLE | false | 可对表格中的多行进行选择 |
SelectionMode.MULTUPLE | true | 可对多行中的多个单元格进行多选 |
TreeTableView组件在多行中对多个单元格进行选择。
为单元格启用多选模式
1
2
|
treeTableView.getSelectionModel().setSelectionMode(SelectionMode.MULTIPLE);
treeeTableView.getSelectionModel().setCellSelectionEnabled(true);
|
对表格单元格的多选操作