JavaFX【TableView使用详解】

news/2024/12/23 1:46:48/

目录

概述

组件

Student

ObservableList

TableView

setCellValueFactory()

TableColumn

1. Callback

2. PropertyValueFactory

增加到末行

1、tableView.getItems().add(Student s)

2、list.add(Student s)

删除指定行

1、tableView.getItems().remove(int i)

2、list.remove(int i)

修该指定行

1、tableView.getItems().set(int i,Student s)

2、s.setX()


 

概述

TableView是JavaFX的一个重要的组件,毕竟我们在实际工作中表格还是经常使用的东西,不管是存储数据还是展示数据。

组件

接下来我们以学生信息为例,把它放到JavaFX的TableView中去展示,并看一下如何来实现增删改的操作。下面是我们需要用到的类:

Student

在JavaFX中,每一行数据就是一个Bean对象,也就是我们一个Java的实体类(类必须是public的),需要我们自己定义,这里我们的类名就叫Student。

public class Student {private String name;private int age;private double score;private  boolean is;public Data(String name, int age, double score, boolean is) {this.name = name;this.age = age;this.score = score;this.is = is;}public String getName() {return name;}public void setName(String name) {this.name = name;}public int getAge() {return age;}public void setAge(int age) {this.age = age;}public double getScore() {return score;}public void setScore(double score) {this.score = score;}public boolean isIs() {return is;}public void setIs(boolean is) {this.is = is;}
}

ObservableList<Student>

这是我们的数据源,泛型参数就是我们的Student对象,使用时只需要通过下面这句构造:

ObservableList<Student> list = FXCollections.observableArrayList();

显然,通过名字我们就可以看出来,它支持类似于我们List集合的一些操作,待会增删改的时候再详细介绍。 

TableView<Student>

这个类负责我们表格的展示,构造方法如下:

//新建tableView并指定数据源TableView<Data> tableView = new TableView<>(list);

只指定数据源其实是不够的,我们知道,一个表格包括“表头”和“身体”,而且需要注意的是:我们的TableView是以一列为一个对象的,所以我们需要设置tableview的属性(表头和内容),数据的显示主要有两种方法:

setCellValueFactory()

TableColumn

        这是表头,它负责表头的展示,因为前面我们已经指定了数据源,所以这里我们可以通过它来指定每一个列对象的内容(其实就是指定每一列的数据类型),setCellValueFactory()需要传入参数,我们可以通过两种参数来指定:

1. Callback

//第一列 姓名
TableColumn<Data,String> col_name = new TableColumn<>("姓名");
tableView.getColumns().add(col_name);//添加到tableView中展示
//设置该列的数据类型-返回单元格内容
col_name.setCellValueFactory(new Callback<TableColumn.CellDataFeatures<Data, String>, ObservableValue<String>>() {@Overridepublic ObservableValue<String> call(TableColumn.CellDataFeatures<Data, String> param) {SimpleStringProperty name = new SimpleStringProperty(param.getValue().getName());return name;}});
//第二列 年龄 -这里的泛型是Number不是Integer
TableColumn<Data,Number> col_age = new TableColumn<>("年龄");
tableView.getColumns().add(col_age);
//这里的泛型是Number不是Integer,因为SimpleIntegerProperty继承了Observable<Number>接口,泛型是Number不是Integercol_age.setCellValueFactory(new Callback<TableColumn.CellDataFeatures<Data, Number>, ObservableValue<Number>>() {@Overridepublic ObservableValue<Number> call(TableColumn.CellDataFeatures<Data, Number> param) {SimpleIntegerProperty age = new SimpleIntegerProperty(param.getValue().getAge());return age;}});
//第三列 战斗力 -这里的泛型是Number不是Boolean
TableColumn<Data,Number> col_score = new TableColumn<>("战斗力");
tableView.getColumns().add(col_score);
col_score.setCellValueFactory(new Callback<TableColumn.CellDataFeatures<Data, Number>, ObservableValue<Number>>() {@Overridepublic ObservableValue<Number> call(TableColumn.CellDataFeatures<Data, Number> param) {SimpleDoubleProperty score = new SimpleDoubleProperty(param.getValue().getScore());return score;}});
//第四列 是否无敌
TableColumn<Data,Boolean> col_is = new TableColumn<>("是否无敌");
tableView.getColumns().add(col_is);col_is.setCellValueFactory(new Callback<TableColumn.CellDataFeatures<Data, Boolean>, ObservableValue<Boolean>>() {@Overridepublic ObservableValue<Boolean> call(TableColumn.CellDataFeatures<Data, Boolean> param) {SimpleBooleanProperty is = new SimpleBooleanProperty(param.getValue().isIs());return is;}});

需要注意的是,我们JavaFX对普通Java支持的基本类型进行了抽象,我们需要使用JavaFX规定的数据类型,比如我们的 Integer 和 Double 都需要转为Number类型,但是String和Boolean不需要。

2. PropertyValueFactory

需要注意的是,如果使用这种方法来指定内容的数据类型,这里我们可以使用Java自己的数据类型不需要使用JavaFX的Number类型,因此这种也更加简便:

//第一列 姓名TableColumn<Data,String> col_name = new TableColumn<>("姓名");tableView.getColumns().add(col_name);//第二列 年龄 --这里不需要使用Number代替TableColumn<Data,Integer> col_age = new TableColumn<>("年龄");tableView.getColumns().add(col_age);//第三列 战斗力 -这里不需要使用Number代替TableColumn<Data,Double> col_score = new TableColumn<>("战斗力");tableView.getColumns().add(col_score);//第四列TableColumn<Data,Boolean> col_is = new TableColumn<>("是否无敌");tableView.getColumns().add(col_is);col_name.setCellValueFactory(new PropertyValueFactory<Data,String>("name"));
col_age.setCellValueFactory(new PropertyValueFactory<Data,Integer>("age"));
col_age.setCellValueFactory(new PropertyValueFactory<Data,Double>("score"));
col_age.setCellValueFactory(new PropertyValueFactory<Data,Boolean>("is"));

增加到末行

        显然对数据进行增删改其实就是通过修改我们的数据源(ObservableList<Student>)的数据集合list来实现的,这里又是可以通过两种方法来实现:

1、tableView.getItems().add(Student s)

Button bu = new Button("增加一行数据");
bu.setOnAction(event->{//增加到最后一行tableView.getItems().add(new Data("石敢当",999,100.0,true));});

2、list.add(Student s)

bu.setOnAction(event->{list.add(new Data("石敢当",999,100.0,true));tableView.refresh();});

删除指定行

同样是两种方法(参数为0代表删除第一行,1代表第二行,以次类推...):

1、tableView.getItems().remove(int i)

//删除第一行bu_rm.setOnAction(event -> {tableView.getItems().remove(0);//0是第一行,1是第二行,以此类推});

2、list.remove(int i)

//删除第一行bu_rm.setOnAction(event -> {list.remove(0);tableView.refresh();});

修该指定行

同样两张方法:

1、tableView.getItems().set(int i,Student s)

表示将第 i+1 行的内容换为新的对象s

//修改第一行bu_update.setOnAction(event -> {//同样0是第一行,1是第二行,以此类推tableView.getItems().set(0,new Data("熊大",18,80.0,true));});

2、s.setX()

//数据源
ObservableList<Data> list = FXCollections.observableArrayList();
//一行内容对对应的对象
Student s1 = new Student("李大喜",15,75.0,false);
list.add(s1);//对已经有的对象进行修该实现表格的内容更新bu_update.setOnAction(event -> {//只修改属性我们可以通过Bean对象的set方法来修改,减少对象的创建s1.setAge(20);tableView.refresh();//需要刷新才能修改成功});

注意:使用list的方法进行add、remove以及使用直接对对象进行修改的时候,我们需要刷新一下tableView才能重新展示数据。


http://www.ppmy.cn/news/85944.html

相关文章

k8s进阶5——AppArmor、Seccomp、ImagePolicyWebhook

文章目录 一、AppArmor限制容器对资源访问1.1 实现步骤1.1.1 定义策略1.1.2 加载策略1.1.3 引用策略 2.2 案例 二、Seccomp 限制容器进程系统调用案例一&#xff1a;使用自定义策略案例二&#xff1a;使用容器运行时默认策略 三、动态准入控制Webhook3.1 ImagePolicyWebhook控制…

易观分析:消费金融机构以APP为触点,创新消费场景,激发消费活力

易观&#xff1a;随着“用好消费金融、释放消费潜力”等金融支持扩内需的持续深入&#xff0c;消费金融APP活跃用户规模将保持稳健增长的态势&#xff0c;进而在拉动内需、促进消费升级、服务实体经济中扮演更重要的角色。 一、疫情防控较快平稳转段&#xff0c;激发消费市场活…

Spring之DI(依赖注入)

依赖注入&#xff08;DI&#xff09;是一个过程&#xff0c;在这个过程中&#xff0c;对象仅通过构造函数参数、工厂方法的参数或在对象被实例化后通过属性设置来定义它们的依赖项&#xff08;即与该对象一起工作的其他对象&#xff09;。然后&#xff0c;容器在创建 bean 时注…

finally 和 return的执行关系,try..catch..finally

目录 结论 基础类型Int&#xff0c;返回值 基础类型String&#xff0c;返回值 基础类型StringBuffer&#xff0c;返回值 复合类型Map&#xff0c;返回引用 自定义类型&#xff0c;返回引用 执行了finally 里的return 结论 程序执行到return时 如果返回的是基础变量&#…

SpringCloud Sentinel实战限流熔断降级应用

目录 1 Sentinel核心库1.1 Sentinel介绍1.2 Sentinel核心功能1.2.1 流量控制1.2.2 熔断降级 2 Sentinel 限流熔断降级2.1 SentinelResource定义资源2.2 Sentinel的规则2.2.1 流量控制规则 (FlowRule)2.2.2 熔断降级规则 (DegradeRule)2.2.3 系统保护规则 (SystemRule)2.2.4 访问…

(浙大陈越版)数据结构 第三章 树(上) 3.2 二叉树及存储结构

目录 3.2.1 二叉树的定义及性质 定义: 二叉树五种基本形态&#xff1a; 特殊二叉树 二叉树的几个重要性质 二叉树的抽象数据类型定义 操作集&#xff1a; 常用遍历&#xff1a; 3.2.2 二叉树的存储结构 顺序存储结构 数组实现 链表实现 3.2.1 二叉树的定义及性质 …

基础篇009.1 STM32驱动RC522 RFID模块之一:基础知识

目录 1. RFID概述 1.1 RFID工作原理 1.2 RFID分类 1.3 RFID模块 1.4 RFID卡片 1.5 IC卡和ID卡介绍 1.6 IC卡和ID的区分 2. Mifare卡结构原理 2.1 Mifare卡概述 2.2 Mifare非接触式 IC 卡性能简介&#xff08;M1&#xff09; 2.2.1 Mifare S50与Mifare S70 2.2.2 S5…

甘肃棒球发展建设·棒球1号位

概述 甘肃省位于中国西北部&#xff0c;地理环境独特&#xff0c;拥有丰富的历史文化底蕴。近年来&#xff0c;棒球在甘肃得到了较快的发展&#xff0c;但仍存在一些问题和挑战。本报告将分析甘肃棒球的现状、发展潜力以及应对策略。 现状分析 1. 基础设施&#xff1a;甘肃省…