JavaFX【TableView使用详解】

article/2025/8/26 14:37:51

目录

概述

组件

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 Student(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<Student> tableView = new TableView<>(list);

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

setCellValueFactory()

TableColumn

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

1. Callback

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

增加到末行

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

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

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

2、list.add(Student s)

bu.setOnAction(event->{list.add(new Student("石敢当",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 Student("熊大",18,80.0,true));});

2、s.setX()

//数据源
ObservableList<Student> 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才能重新展示数据。

完整代码

TableTest

import com.sun.org.apache.bcel.internal.generic.NEW;
import com.sun.org.apache.xpath.internal.operations.Bool;import javafx.application.Application;
import javafx.collections.FXCollections;
import javafx.collections.ObservableList;
import javafx.scene.Scene;
import javafx.scene.control.Button;
import javafx.scene.control.TableColumn;
import javafx.scene.control.TableView;
import javafx.scene.control.cell.PropertyValueFactory;
import javafx.scene.layout.AnchorPane;
import javafx.stage.Stage;public class TableTest extends Application{public static void main(String[] args) {launch(args);}@Overridepublic void start(Stage primaryStage) throws Exception {ObservableList<Student> list = FXCollections.observableArrayList();list.add(new Student("燕双鹰", 18, 90.0, true));TableView tableView = new TableView(list);TableColumn<Student,String> col_name = new TableColumn<>("姓名");tableView.getColumns().add(col_name);TableColumn<Student,Integer> col_age = new TableColumn<>("年龄");tableView.getColumns().add(col_age);TableColumn<Student,Double> col_score = new TableColumn<>("分数");tableView.getColumns().add(col_score);TableColumn<Student,Boolean> col_is = new TableColumn<>("无敌");tableView.getColumns().add(col_is);col_name.setCellValueFactory(new PropertyValueFactory<Student,String>("name"));col_age.setCellValueFactory(new PropertyValueFactory<Student,Integer>("age"));col_score.setCellValueFactory(new PropertyValueFactory<Student,Double>("score"));col_is.setCellValueFactory(new PropertyValueFactory<Student,Boolean>("is"));AnchorPane pane = new AnchorPane();pane.getChildren().addAll(tableView);AnchorPane.setLeftAnchor(tableView, 50.0);AnchorPane.setTopAnchor(tableView, 50.0);Button add = new Button("添加一行");add.setOnAction(event->{tableView.getItems().add(new Student("光头强", 20, 80.0, true));//不需要刷新//			list.add(new Student("李大喜", 15, 50.0, true));
//			tableView.refresh();});pane.getChildren().add(add);AnchorPane.setLeftAnchor(add, 20.0);Button del = new Button("删除第一行");del.setOnAction(event->{tableView.getItems().remove(0);//			list.remove(0);
//			tableView.refresh();});pane.getChildren().add(del);AnchorPane.setLeftAnchor(del, 80.0);Button change = new Button("修改第一行");change.setOnAction(event->{tableView.getItems().set(0, new Student("光头强", 20, 80.0, true));//不需要刷新//			list.set(0,new Student("李大喜", 15, 50.0, true));
//			tableView.refresh();});pane.getChildren().add(change);AnchorPane.setLeftAnchor(change, 160.0);Scene scene = new Scene(pane);primaryStage.setTitle("Javafx");primaryStage.setScene(scene);primaryStage.setHeight(600);primaryStage.setWidth(600);primaryStage.show();}}


http://chatgpt.dhexx.cn/article/j6CgY9FG.shtml

相关文章

QT中TableView数据展示

QT中TableView数据展示 最近在学习QT,大量数据从数据库取出放入QT界面中展示&#xff0c;这时用到了tableView&#xff0c;一些简单的使用分享给大家。 创建数据模型 QStandardItemModel *modelnew QStandardItemModel(); QStandardItemModel是Qt库中的一个类&#xff0c;它…

JAVAFX的TableView基本用法

JAVAFX中的表格显示主要使用TableView 与TableView相关的类: TableColumn TableRow TableCell TablePosition TableViewFocusModel TableViewSelectionModel JavaFX TableView例子: import javafx.application.Application; import javafx.scene.Scene; import javafx.scene…

QT之Tableview

想要了解更多的tableview可以看这位博客Qt深入浅出&#xff08;十五&#xff09;QTableView​ 这里做了一个简单的学生系统查询功能显示Tableview&#xff1a; 表格视图控件QTableView&#xff0c;需要和QStandardItemModel, 配套使用&#xff0c;这套框架是基于MVC设计模式设…

QML TableView 使用详解

目录 一、—个简单的TableView实例 二、TableViewColumn 属性讲解 三、定制表格外观 3.1 itemDelegate3.2 rowDelegate3.3 headerDelegate3.4 定制表格外观后的示例 四、动态增删改查 TabelView TableView 就是 Qt Quick 为表格式呈现数据提供的组件。想必兄台用过 Excel…

QT控件之(TableView)的居中效果

T将tableView中的表头以及文本内容都进行居中处理 1、需要在构造函数中增加一句&#xff1a; //以下增加的是表头的效果 ui->tableView->horizontalHeader()->setSectionResizeMode(QHeaderView::Stretch);//布局排版是全部伸展开的效果2、就是直接对tableView的文本内…

QML学习十七:TableView的简单使用

若该文为原创文章&#xff0c;转载请注明原文出处 一、TableView TableView是Qt Quick为表格式呈现数据提供的组件。 TableView与ListView类似&#xff0c;相比之下多了滚动条、挑选、可调整尺寸的表头等特性&#xff0c;数据也是通过Model来提供&#xff0c;此篇使用的是内建…

JavaFX中TableView的使用

稍微说说JavaFX里面TableView怎么用&#xff0c;&#xff08;其实在JavaFX的源码中都有示例。。。&#xff09; 首先要了解TableView是用来做什么的&#xff0c;TableView是JavaFX的一个表视图&#xff0c;用来显示表格的&#xff0c;在TableView的类注释中写了 /*** see Tab…

Qt4实现TableView显示表格数据

最近又开始搞QT开发了&#xff0c;前面学的MVC啥的都忘得差不多了&#xff0c;重新整理一遍思路吧。 目前的需求是&#xff1a;读取文本文件&#xff0c;表格型数据&#xff0c;用tableview显示出来&#xff0c;最后画图。这涉及到三个问题&#xff0c;文件读写&#xff0c;数…

NAT模式下的虚拟机网络配置

原理 NAT模式&#xff0c;也叫地址转换模式&#xff0c; 当把我们的虚拟机的上网方式设置为NAT模式时&#xff0c;虚拟机、宿主机、各网卡之间的连接关系可用下图来表示&#xff1a; 具体配置流程 1 将本地以太网共享到v8适配器上 2 查看虚拟网络编辑中的NAT模式下的子网IP…

虚拟机vmware设置nat模式上网

桥接模式上网&#xff1a;虚拟机vmware设置桥接模式上网_cao849861802的博客-CSDN博客 首先虚拟机有两个虚拟网卡vmnet0和vmnet8 这个vmnet0默认的是桥接模式&#xff0c;这个vmnet8默认是nat模式&#xff1b; 我们这里只看nat模式&#xff0c;所以先不关心vmnet0虚拟网卡&a…

VMware16NAT模式配置固定IP

文章目录 前言一、NAT配置固定IP二、重启网卡结尾 前言 为什么要配置固定IP呀&#xff1f;这个很容易解释啊&#xff0c;因为配置集群要设置固定IP&#xff08;主结点需要管理子结点&#xff0c;通过固定IP识别机器&#xff09;&#xff0c;因为你访问虚拟机方便&#xff08;不…

VMware Workstation中桥接模式、NAT模式、仅主机模式

一、VMware虚拟机的网络模式 VMware工作站虚拟机有三种网络模式【①桥接模式 ②NAT模式 ③仅主机模式】,如下图所示: 二、VMware虚拟机的网络模式介绍 2.0、VMware的虚拟设备 VMware的虚拟设备 序号虚拟设备编号说明1VMnet0是虚拟桥接网络下的虚拟交换机2VMnet1是虚拟Host-…

vm虚拟机nat模式配置

痛点&#xff1a; 为了解决虚拟机与板子网络的调试的问题&#xff0c;我之前一直用桥接&#xff0c;如果虚拟机想上网就桥接到无线网卡&#xff0c;如果想连接板子&#xff0c;就桥接到有线网卡&#xff0c;麻烦&#xff0c;需要来回切换&#xff0c;还有就是不插板子的情况下和…

nat模式

原文链接&#xff1a;https://www.linuxidc.com/Linux/2016-09/135521p2.htm &#xff08;复制过来只是为了学习方便&#xff0c;如有不妥会立即删除&#xff09; 二、NAT&#xff08;地址转换模式&#xff09; 刚刚我们说到&#xff0c;如果你的网络ip资源紧缺&#xff0c;但…

虚拟机NAT模式无法联网

工作中遇到NAT模式虚拟机&#xff0c;修改了编辑-虚拟网络编辑器 中NAT设置IP&#xff0c;DNS&#xff0c;DHCP等配置&#xff0c;在centos8中修改了ens33文件都无法联网的情况&#xff0c;特此总结解决方案 按照该方法尝试后无效&#xff08;解决方法在下面&#xff09; 第一…

桥接模式NAT模式 详解

NAT模式 和 桥接模式 网络地址转换 NAT &#xff1a; 首先看一下NAT的概念&#xff1a;装有NAT软件的路由器叫做NAT路由器&#xff0c;它至少有一个有效的外部全球IP地址&#xff0c;这样所有使用本地地址&#xff08;内部专用地址&#xff09;的主机在和外界通信时&#xff…

虚拟机NAT模式无法上网

虚拟机NAT模式无法上网 一、确认虚拟机的ip地址二、确认服务是否开启 一、确认虚拟机的ip地址 确认虚拟机的ip地址与本机的vmnet8的ip地址是否在同一个网段&#xff0c;且网关是否一致&#xff1a; cd /etc/sysconfig/network-scripts/ ls vi ifcfg-ens33如果ip配置都没有问…

【VMware】NAT模式、桥接模式、仅主机模式

VMware的NAT模式、桥接模式、仅主机模式 转载自&#xff1a;https://wxler.github.io/2021/02/02/221724/ 1. NAT模式 拓扑图&#xff1a; 在NAT网络中&#xff0c;会用到VMware Network AdepterVMnet8虚拟网卡。 VMware Network AdepterVMnet8是主机上的一块虚拟网卡&…

虚拟机NAT模式集群改为桥接模式集群

有时候&#xff0c;A 电脑要访问 B 电脑上安装的虚拟机&#xff0c;尴尬的是之前虚拟机配置的网络连接模式为 NAT 模式。 那怎么才能让 A 电脑正常地访问 B 电脑上的虚拟机呢&#xff1f;就需要将虚拟机的网络连接模式由 NAT 模式修改为 桥接模式 。 需要下面简单的几步就可以…

LVS NAT模式配置实践

1. LVS单网卡配置 注&#xff1a;实际应用中LVS使用双网卡&#xff0c;这里仅做演示用。架构图如下&#xff1a; 单网卡LVS 1.1 机器信息 LVS LVS&#xff1a;eth0 10.10.1.100&#xff08;VIP&#xff09; Real Server RS1&#xff1a;eth0 10.10.1.1RS2&#xff1a;eth…