標籤:
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就會自動更新。
未完待續....
參考資料:
http://stackoverflow.com/questions/20048072/cant-fill-table-with-items-with-javafx
http://stackoverflow.com/questions/17035478/javafx-propertyvaluefactory-not-populating-tableview
http://blog.netopyr.com/2011/05/13/javafx-properties/
https://github.com/marcojakob/code.makery.ch/blob/master/collections/blog/14-05-10-update-to-javafx-8-whats-new.md
https://docs.oracle.com/javafx/2/ui_controls/table-view.htm
JavaFX TableView和Java Beans Pattern Convention