当前位置:   article > 正文

javaFX学习之TreeTableView组件的使用

treetableview

原文地址: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);

对表格单元格的多选操作 

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/羊村懒王/article/detail/191650
推荐阅读
  

闽ICP备14008679号