Computer Science II 课上的作业老师要求完成一个Course Schedule的Exporter,在后台界面需要实现三个表格:Holiday Schedule, Lecture Schedule, Assignments Schedule。
某位同学忙活了半天好不容易创建了一个TableView,但是当edit表中的cell的时候,对应的值总是不变。昨天晚上看了十几分钟把我之前做错的点全部都过了一遍,依然找不到错误。不过秉承着死磕到底的精神,今天看了Oracle的TableView的教程和stackoverflow上同类问题的解答,终于有了一个解答的思路。真是山穷水复疑无路柳暗花明又一村!如果是正常的程序Bug那么就没有记录在博客上的意义了。因为其实这个Bug是不容易发现的,因为这个Bug产生的原因是因为JavaFX组件的机制造成的。
在这篇博文里我主要想写两个部分: JavaFX的TableView的简单实现和Java Beans Pattern Convention。
JavaFX TableView - Oracle JavaFX TableView Tutorial
创建TableView的主要操作:
1.创建Table
首先构建表格的基本骨架:
TableView table = new TableView();
TableColumn firstNameCol = new TableColumn("first name"); // "first name"是这个TableColumn的title
TableColumn lastNameCol = new TableColumn("last name"); // "last name"是这个TableColumn的title
table.getColumns().addAll(firstNameCol, lastNameCol); // 将TableColumn“包裹”进table
然后设置每一列表格的data type:
//下面这两行分别初始化了每一列的数据类型. PropertyValueFactory<S, T>("nameInModel") 之中,S表示在数据模型(见下栏)之中的基本类型,T表示在表格之中显示的类型,nameInModel表示这个数据域在数据模型里面的变量名字。这些是Java Beans Pattern的约定俗成的规定,如果不按照这个标准来完成的表格就无法实现更改数据之后自动更新GUI界面。
firstNameCol.setCellValueFactory(new PropertyValueFactory<String, String>("firstName")); //
lastNameCol.setCellValueFactory(new PropertyValueFactory<String, String>("lastname"));
2.定义数据模型(Data Model)
Public Class Person{
final StringProperty firstName = new SimpleStringProperty(); // StringProperty是虚类, SimpleStringProperty是一个concrete class
final StringProperty lastName = new SimpleStringProperty();
// Getters Setters
// 注意!下面这两个函数非常重要,因为Java beans(后面会介绍)的代码规范,Data Model Class的variable需要实现类似于 xProperty()这样的函数,x是变量名。
public StringProperty firstNameProperty(){ return firstName; }
public StringProperty lastNameProperty() { return lastName; }
}
之后我们要将创建一个ObservableList来存储这些Person的实例数据。
ObservableList data = ... // 反正就加了person的实例进去了
3.数据模型和table关联
table.setItems(data);
好了,现在数据就和表格关联起来了!由于我们的数据是存在ObservableList里面的,所以每当表格里面有更改的时候,Table的view就会自动更新。
未完待续....