当前位置:   article > 正文

JavaFX【TableView使用详解】_javafx tableview

javafx tableview

目录

概述

组件

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。

  1. public class Student {
  2. private String name;
  3. private int age;
  4. private double score;
  5. private boolean is;
  6. public Student(String name, int age, double score, boolean is) {
  7. this.name = name;
  8. this.age = age;
  9. this.score = score;
  10. this.is = is;
  11. }
  12. public String getName() {
  13. return name;
  14. }
  15. public void setName(String name) {
  16. this.name = name;
  17. }
  18. public int getAge() {
  19. return age;
  20. }
  21. public void setAge(int age) {
  22. this.age = age;
  23. }
  24. public double getScore() {
  25. return score;
  26. }
  27. public void setScore(double score) {
  28. this.score = score;
  29. }
  30. public boolean isIs() {
  31. return is;
  32. }
  33. public void setIs(boolean is) {
  34. this.is = is;
  35. }
  36. }

ObservableList<Student>

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

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

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

TableView<Student>

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

  1. //新建tableView并指定数据源
  2. TableView<Student> tableView = new TableView<>(list);

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

setCellValueFactory()

TableColumn

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

1. Callback

  1. //第一列 姓名
  2. TableColumn<Student,String> col_name = new TableColumn<>("姓名");
  3. tableView.getColumns().add(col_name);//添加到tableView中展示
  4. //设置该列的数据类型-返回单元格内容
  5. col_name.setCellValueFactory(new Callback<TableColumn.CellDataFeatures<Student, String>, ObservableValue<String>>() {
  6. @Override
  7. public ObservableValue<String> call(TableColumn.CellDataFeatures<Student, String> param) {
  8. SimpleStringProperty name = new SimpleStringProperty(param.getValue().getName());
  9. return name;
  10. }
  11. });
  12. //第二列 年龄 -这里的泛型是Number不是Integer
  13. TableColumn<Student,Number> col_age = new TableColumn<>("年龄");
  14. tableView.getColumns().add(col_age);
  15. //这里的泛型是Number不是Integer,因为SimpleIntegerProperty继承了Observable<Number>接口,泛型是Number不是Integer
  16. col_age.setCellValueFactory(new Callback<TableColumn.CellDataFeatures<Student, Number>, ObservableValue<Number>>() {
  17. @Override
  18. public ObservableValue<Number> call(TableColumn.CellDataFeatures<Student, Number> param) {
  19. SimpleIntegerProperty age = new SimpleIntegerProperty(param.getValue().getAge());
  20. return age;
  21. }
  22. });
  23. //第三列 战斗力 -这里的泛型是Number不是Boolean
  24. TableColumn<Student,Number> col_score = new TableColumn<>("战斗力");
  25. tableView.getColumns().add(col_score);
  26. col_score.setCellValueFactory(new Callback<TableColumn.CellDataFeatures<Student, Number>, ObservableValue<Number>>() {
  27. @Override
  28. public ObservableValue<Number> call(TableColumn.CellDataFeatures<Student, Number> param) {
  29. SimpleDoubleProperty score = new SimpleDoubleProperty(param.getValue().getScore());
  30. return score;
  31. }
  32. });
  33. //第四列 是否无敌
  34. TableColumn<Student,Boolean> col_is = new TableColumn<>("是否无敌");
  35. tableView.getColumns().add(col_is);
  36. col_is.setCellValueFactory(new Callback<TableColumn.CellDataFeatures<Student, Boolean>, ObservableValue<Boolean>>() {
  37. @Override
  38. public ObservableValue<Boolean> call(TableColumn.CellDataFeatures<Student, Boolean> param) {
  39. SimpleBooleanProperty is = new SimpleBooleanProperty(param.getValue().isIs());
  40. return is;
  41. }
  42. });

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

2. PropertyValueFactory

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

  1. //第一列 姓名
  2. TableColumn<Student,String> col_name = new TableColumn<>("姓名");
  3. tableView.getColumns().add(col_name);
  4. //第二列 年龄 --这里不需要使用Number代替
  5. TableColumn<Student,Integer> col_age = new TableColumn<>("年龄");
  6. tableView.getColumns().add(col_age);
  7. //第三列 战斗力 -这里不需要使用Number代替
  8. TableColumn<Student,Double> col_score = new TableColumn<>("战斗力");
  9. tableView.getColumns().add(col_score);
  10. //第四列
  11. TableColumn<Student,Boolean> col_is = new TableColumn<>("是否无敌");
  12. tableView.getColumns().add(col_is);
  13. col_name.setCellValueFactory(new PropertyValueFactory<Student,String>("name"));
  14. col_age.setCellValueFactory(new PropertyValueFactory<Student,Integer>("age"));
  15. col_age.setCellValueFactory(new PropertyValueFactory<Student,Double>("score"));
  16. col_age.setCellValueFactory(new PropertyValueFactory<Student,Boolean>("is"));

增加到末行

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

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

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

2、list.add(Student s)

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

删除指定行

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

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

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

2、list.remove(int i)

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

修该指定行

同样两张方法:

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

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

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

2、s.setX()

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

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

完整代码

TableTest

  1. import com.sun.org.apache.bcel.internal.generic.NEW;
  2. import com.sun.org.apache.xpath.internal.operations.Bool;
  3. import javafx.application.Application;
  4. import javafx.collections.FXCollections;
  5. import javafx.collections.ObservableList;
  6. import javafx.scene.Scene;
  7. import javafx.scene.control.Button;
  8. import javafx.scene.control.TableColumn;
  9. import javafx.scene.control.TableView;
  10. import javafx.scene.control.cell.PropertyValueFactory;
  11. import javafx.scene.layout.AnchorPane;
  12. import javafx.stage.Stage;
  13. public class TableTest extends Application{
  14. public static void main(String[] args) {
  15. launch(args);
  16. }
  17. @Override
  18. public void start(Stage primaryStage) throws Exception {
  19. ObservableList<Student> list = FXCollections.observableArrayList();
  20. list.add(new Student("燕双鹰", 18, 90.0, true));
  21. TableView tableView = new TableView(list);
  22. TableColumn<Student,String> col_name = new TableColumn<>("姓名");
  23. tableView.getColumns().add(col_name);
  24. TableColumn<Student,Integer> col_age = new TableColumn<>("年龄");
  25. tableView.getColumns().add(col_age);
  26. TableColumn<Student,Double> col_score = new TableColumn<>("分数");
  27. tableView.getColumns().add(col_score);
  28. TableColumn<Student,Boolean> col_is = new TableColumn<>("无敌");
  29. tableView.getColumns().add(col_is);
  30. col_name.setCellValueFactory(new PropertyValueFactory<Student,String>("name"));
  31. col_age.setCellValueFactory(new PropertyValueFactory<Student,Integer>("age"));
  32. col_score.setCellValueFactory(new PropertyValueFactory<Student,Double>("score"));
  33. col_is.setCellValueFactory(new PropertyValueFactory<Student,Boolean>("is"));
  34. AnchorPane pane = new AnchorPane();
  35. pane.getChildren().addAll(tableView);
  36. AnchorPane.setLeftAnchor(tableView, 50.0);
  37. AnchorPane.setTopAnchor(tableView, 50.0);
  38. Button add = new Button("添加一行");
  39. add.setOnAction(event->{
  40. tableView.getItems().add(new Student("光头强", 20, 80.0, true));//不需要刷新
  41. // list.add(new Student("李大喜", 15, 50.0, true));
  42. // tableView.refresh();
  43. });
  44. pane.getChildren().add(add);
  45. AnchorPane.setLeftAnchor(add, 20.0);
  46. Button del = new Button("删除第一行");
  47. del.setOnAction(event->{
  48. tableView.getItems().remove(0);
  49. // list.remove(0);
  50. // tableView.refresh();
  51. });
  52. pane.getChildren().add(del);
  53. AnchorPane.setLeftAnchor(del, 80.0);
  54. Button change = new Button("修改第一行");
  55. change.setOnAction(event->{
  56. tableView.getItems().set(0, new Student("光头强", 20, 80.0, true));//不需要刷新
  57. // list.set(0,new Student("李大喜", 15, 50.0, true));
  58. // tableView.refresh();
  59. });
  60. pane.getChildren().add(change);
  61. AnchorPane.setLeftAnchor(change, 160.0);
  62. Scene scene = new Scene(pane);
  63. primaryStage.setTitle("Javafx");
  64. primaryStage.setScene(scene);
  65. primaryStage.setHeight(600);
  66. primaryStage.setWidth(600);
  67. primaryStage.show();
  68. }
  69. }

声明:本文内容由网友自发贡献,转载请注明出处:【wpsshop博客】
推荐阅读
相关标签
  

闽ICP备14008679号