前言
最近在著手一個(gè)學(xué)生管理系統(tǒng)的編寫(xiě)拥娄,涉及到TableView的使用茴扁,這前前后后的也有了些經(jīng)驗(yàn)和想法想要記錄和分享一下(事實(shí)上我正在想要用html網(wǎng)頁(yè)代替界面),更多的是學(xué)習(xí)之用靴跛。
先看看TableView中有些什么
在IDEA中谦絮,按住Ctrl然后點(diǎn)中TableView關(guān)鍵字會(huì)自動(dòng)跟進(jìn)到它定義的地方,我們可以先看看這里面到底都有些什么東西紧显。
你會(huì)比較先的看到它的兩個(gè)構(gòu)造函數(shù):
// 第一個(gè)構(gòu)造函數(shù)
public TableView() {
this(FXCollections.<S>observableArrayList());
}
// 第二個(gè)構(gòu)造函數(shù)
public TableView(ObservableList<S> items) {
getStyleClass().setAll(DEFAULT_STYLE_CLASS);
setAccessibleRole(AccessibleRole.TABLE_VIEW);
// we quite happily accept items to be null here
setItems(items);
// install default selection and focus models
// it's unlikely this will be changed by many users.
setSelectionModel(new TableViewArrayListSelectionModel<S>(this));
setFocusModel(new TableViewFocusModel<S>(this));
// we watch the columns list, such that when it changes we can update
// the leaf columns and visible leaf columns lists (which are read-only).
getColumns().addListener(weakColumnsObserver);
// watch for changes to the sort order list - and when it changes run
// the sort method.
getSortOrder().addListener((ListChangeListener<TableColumn<S, ?>>) c -> {
doSort(TableUtil.SortEventType.SORT_ORDER_CHANGE, c);
});
// We're watching for changes to the content width such
// that the resize policy can be run if necessary. This comes from
// TreeViewSkin.
getProperties().addListener(new MapChangeListener<Object, Object>() {
@Override
public void onChanged(Change<? extends Object, ? extends Object> c) {
if (c.wasAdded() && SET_CONTENT_WIDTH.equals(c.getKey())) {
if (c.getValueAdded() instanceof Number) {
setContentWidth((Double) c.getValueAdded());
}
getProperties().remove(SET_CONTENT_WIDTH);
}
}
});
isInited = true;
}
可以大致的看一下讲衫,不過(guò)最重要的是清楚了一點(diǎn):TableView內(nèi)部是維護(hù)了一個(gè)類型為FXCollections.< S >observableArrayList的集合。其中< S >代表用戶自己定義的類型孵班。
也可以看到如何給Table添加監(jiān)聽(tīng)者:
getProperties().addListener(new MapChangeListener<Object, Object>() {
@Override
public void onChanged(Change<? extends Object, ? extends Object> c) {
if (c.wasAdded() && SET_CONTENT_WIDTH.equals(c.getKey())) {
if (c.getValueAdded() instanceof Number) {
setContentWidth((Double) c.getValueAdded());
}
getProperties().remove(SET_CONTENT_WIDTH);
}
}
});
總之你會(huì)看到許多非常有意思的東西焦人,這里就不細(xì)說(shuō)了,有興趣的可以去自己讀一下重父,對(duì)于理解TableView控件有著非常好的幫助花椭,你能顧更加理解它運(yùn)行的原理還有機(jī)制。
實(shí)際的運(yùn)用
我們就來(lái)看看實(shí)際的運(yùn)用吧房午,官方給出了非常詳細(xì)的文檔矿辽,有幸找到了把它翻譯成較好版本中文的網(wǎng)站,直接給鏈接郭厌,里面就有一些簡(jiǎn)單的應(yīng)用:
簡(jiǎn)單的應(yīng)用:http://www.javafxchina.net/blog/2015/04/doc03_tableview/
官方的文檔:http://docs.oracle.com/javafx/2/ui_controls/table-view.htm
TableView列的兩種數(shù)據(jù)形式:
一種是維護(hù)類的TableColumn<Person,String>類型袋倔,列的每一個(gè)數(shù)據(jù)都是一個(gè)類(這里是一個(gè)Person類),而String類型對(duì)應(yīng)列名折柠。映射需要這樣設(shè)置:
col.setCellValueFactory(
new PropertyValueFactory<Person, String>("firstName")); // firstName對(duì)應(yīng)列名
另一種是維護(hù)Map的TableColumn<Map,String>類型宾娜,列的每一個(gè)數(shù)據(jù)都是Map。設(shè)置映射時(shí)需要這樣:
col.setCellValueFactory(new MapValueFactory(colName)); // colName對(duì)應(yīng)字符類型列名```
表格可編輯:
可以向官方文檔中那樣扇售,也可以先增加一個(gè)TextFieldTableCell前塔,然后再添加響應(yīng)函數(shù):
// 設(shè)置CellFactory,填充一個(gè)TextField進(jìn)列
col.setCellFactory(TextFieldTableCell.<Map>forTableColumn());
// 設(shè)置編輯響應(yīng)的函數(shù)
col.setOnEditCommit(new EventHandler<TableColumn.CellEditEvent<Map, String>>() {
@Override public void handle(TableColumn.CellEditEvent<Map, String> t) {
System.out.println("檢測(cè)到改變");
// 這里修改維護(hù)的對(duì)應(yīng)的設(shè)置進(jìn)TableView的ObservableList集合
}
});
添加行刪除行也是同樣的操作承冰,可以直接修改TableView維護(hù)的集合來(lái)完成华弓。
增加列,刪除列
這就不僅僅要?jiǎng)h除集合中的數(shù)據(jù)困乒,還要從表格里面的Columns集合中刪除相應(yīng)的數(shù)據(jù)才可以寂屏,或許你還會(huì)在刪除和增加中加入一定的判斷來(lái)保證操作的正確性:
table.getColumns().add(tempCol); // 列表中顯示新增的列
table.getColumns().remove(index); // 刪除index位置的列
監(jiān)聽(tīng)列的變化
你大可以選擇向源文件中的那樣,通過(guò)getProperties().addListener來(lái)完成監(jiān)聽(tīng),同樣也可以添加進(jìn)一個(gè)ListChangeListener:
// 給table設(shè)置監(jiān)聽(tīng)器監(jiān)聽(tīng)列的變化
table.getColumns().addListener(new ListChangeListener() {
@Override
public void onChanged(Change c) {
c.next(); // 接受變化迁霎,否則報(bào)錯(cuò)
// 處理列拖動(dòng)后的事件
if (c.wasRemoved()) {
// 定義一個(gè)保存了現(xiàn)在列排序的集合
List<TableColumn<ObservableList<Map>, String>> newList =
new ArrayList<>(table.getColumns());
// 定義一個(gè)保存了原來(lái)列排序的集合
List<TableColumn<ObservableList<Map>, String>> oldList =
new ArrayList<>(c.getList());
// 相關(guān)操作
} // end if:拖動(dòng)事件處理完畢
}
});
歡迎轉(zhuǎn)載吱抚,轉(zhuǎn)載請(qǐng)注明出處!
簡(jiǎn)書(shū)ID:@我沒(méi)有三顆心臟
github:wmyskxz
歡迎關(guān)注公眾微信號(hào):wmyskxz_javaweb
分享自己的Java Web學(xué)習(xí)之路以及各種Java學(xué)習(xí)資料