JavaFX学习之道:JavaFX之TableView
生活随笔
收集整理的這篇文章主要介紹了
JavaFX学习之道:JavaFX之TableView
小編覺(jué)得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.
?TableView表?
?? TableColumn列?
構(gòu)建一個(gè)表主要有TableView,TableColumn,ObservableList,Bean。?
加入列table.getColumns().addAll(firstNameCol, lastNameCol, emailCol);?
ObservableList里面是存放的數(shù)據(jù)?
table.setItems(observableList);加入數(shù)據(jù)?
observableList里面通常是存放的Bean,列與Bean之間建立聯(lián)系,從而獲取值。?
列與Bean之間建立聯(lián)系:?
emailCol.setCellValueFactory(new PropertyValueFactory<Person, String>("email"));通過(guò)cell值工廠建立與Bean的聯(lián)系。它這里并不須要知道你是傳了什么Bean,它僅僅須要通過(guò)“email”反射成getEmail()方法去Bean里面獲得值,所以Bean屬性定義的名字不須要與它同樣,僅僅須要有g(shù)etEmail()方法。
Java代碼?? firstNameCol.setCellValueFactory(new?Callback<TableColumn.CellDataFeatures<Person,?String>,?ObservableValue<String>>()?{?? @Override?? public?ObservableValue<String>?call(CellDataFeatures<Person,?String>?arg0)?{?????????? //?return?new?? //?SimpleStringProperty(arg0.getValue(),"sd",arg0.getValue().getFirstName());?? //?//bean,?bean的名稱(chēng),值?? return?new?SimpleStringProperty(arg0.getValue().getFirstName());??? //?這樣你能夠不建立值與對(duì)象的映射關(guān)系。?? ????}?? });??
arg0.getValue()等于這里的person。若是你observableList.add(list),則這arg0.getValue()等于list。?
SimpleStringProperty(arg0.getValue(),"sd",arg0.getValue().getFirstName());?
這里的意思既是arg0.getValue()既是你observableList.add的值。“sd”為bean取得名字,arg0.getValue().getFirstName()既是你該列想要獲得的值。假設(shè)是list則arg0.getValue().get(j)則為該列的每行賦值了。?
cell里面不僅僅僅存放文字,還能夠存放其他Node:?
Java代碼?? firstNameCol.setCellFactory(new?Callback<TableColumn<Person,?String>,?TableCell<Person,?String>>()?{?? ????@Override?? ????public?TableCell<Person,?String>?call(?//?單元格內(nèi)容?? ????TableColumn<Person,?String>?arg0)?{?? ???????return?new?TableCell<Person,?String>()?{????????????????@Override?? ?????????protected?void?updateItem(final?String?str,boolean?arg1)?{???????? ??????????????super.updateItem(str,?arg1);?? ?????????if?(arg1)?{????????????????????????????setText(null);?? ????????setGraphic(null);?? ??????????else?{?????????????????????????????????setText(str);?? ??????????????????setGraphic(new?CheckBox());?? ????????}?? ??????????}?? ???????}?? });??
和TreeCell使用一樣,能夠?qū)ell里面弄又一次構(gòu)造。
lastNameCol.setCellFactory(TextFieldTableCell.forTableColumn());有一些默認(rèn)的構(gòu)造,就不須要自己去new TableCell了。?
TableColumn設(shè)置sort的3個(gè)方法?
firstNameCol.setSortNode(new Text("a")); // 默認(rèn)是表頭上的小圖標(biāo)三角形,能夠改變?
firstNameCol.setSortable(true); // 設(shè)置可排序?
firstNameCol.setSortType(SortType.DESCENDING);設(shè)置升降序?
若要在一個(gè)column中包括多個(gè)column。則能夠調(diào)用TableColumn的getColumns().setAll(TableColumn...);?
Java代碼?? ????????firstNameColumn?=?new?TableColumn<Person,?String>("First");?? ????????firstNameColumn.setCellValueFactory(new?PropertyValueFactory<Person,?String>("firstName"));?? //????????firstNameColumn.setCellFactory(TextFieldCellFactory.<Person>forTableColumn());?? ?? ????????lastNameColumn?=?new?TableColumn<Person,?String>("Last");?? ????????lastNameColumn.setCellValueFactory(new?PropertyValueFactory<Person,?String>("lastName"));?? //????????lastNameColumn.setCellFactory(TextFieldCellFactory.<Person>forTableColumn());?? ?? ????????nameColumn?=?new?TableColumn<Person,?String>("Name");?? ????????nameColumn.getColumns().setAll(firstNameColumn,?lastNameColumn);??
table的單元之間有明顯的橫線切割,能夠通過(guò)css去掉。
去掉行橫線?
Java代碼?? .table-view?.table-row-cell?{?? ????-fx-background-insets:?0;?? }??
若想同一時(shí)候去掉沒(méi)有數(shù)據(jù)的豎線?
Java代碼?? .table-row-cell:empty?.table-cell?{?? ????-fx-border-width:?0px;?? }??
若想對(duì)行進(jìn)行操作,能夠通過(guò)setRowFactory。如以下對(duì)行的雙擊進(jìn)行操作?
Java代碼?? ?tableView.setRowFactory(new?Callback<TableView<T>,?TableRow<T>>()?{?? ????????????@Override?? ????????????public?TableRow<T>?call(TableView<T>?param)?{?? ????????????????return?new?TableRowControl();?? ????????????}?? ????????});?? class?TableRowControl?extends?TableRow<T>?{?? ?? ????????public?TableRowControl()?{?? ????????????super();?? ????????????this.setOnMouseClicked(new?EventHandler<MouseEvent>()?{?? ????????????????@Override?? ????????????????public?void?handle(MouseEvent?event)?{?? ????????????????????if?(event.getButton().equals(MouseButton.PRIMARY)?? ????????????????????????????&&?event.getClickCount()?==?2?? ????????????????????????????&&?TableRowControl.this.getIndex()?<?tableView.getItems().size())?{?? ??????????????????????????//doSomething?? ????????????????????}?? ????????????????}?? ????????????});?? ????????}?? ????}??
往table中插入數(shù)據(jù)。table中的數(shù)據(jù)顯示,是依據(jù)你的itemlist來(lái)的。list里面的數(shù)據(jù)排什么序,那table也就排什么序。若加入一條新數(shù)據(jù),直接往list里面加。
Java代碼?? tableView.getItems().add(selectedRow,?newRecord);??
newRecord一個(gè)新的對(duì)象,沒(méi)賦值。?
自己定義TableCell一般都是重寫(xiě)updateItem方法。假設(shè)有須要在編輯做操作,能夠重寫(xiě)startEdit,cancelEdit?
Java代碼?? @Override?? ??????public?void?startEdit()?{?????? ??????????if?(!this.getTableRow().isVisible())?{?? ??????????????return;?? ??????????}?? ??????????super.startEdit();?? ?? ??????????if?(checkBox?==?null)?{?? ??????????????createCheckBox();?? ??????????}?? ??????????setText(null);?? ??????????setGraphic(checkBox);?? ??????}?? ?? ??????@Override?? ??????public?void?cancelEdit()?{?? ??????????super.cancelEdit();?? ??????????setText(getItem().toString());?? ??????????setGraphic(null);?? ??????}??
能夠看到,一旦點(diǎn)擊編輯狀態(tài),則改變Cell里面的內(nèi)容。一離開(kāi)編輯就換成原本cell里面的內(nèi)容。這樣就能夠顯示的時(shí)候就是字符串,而編輯的時(shí)候就能夠弄一個(gè)控件。如日歷。?
獲取選中的TableColumn?
Java代碼?? table.getSelectionModel().getSelectedCells().get(0).getTableColumn()??
table自帶方法能夠過(guò)濾column,也就是僅僅顯示哪些column?
Java代碼?? table.setTableMenuButtonVisible(true);??
設(shè)置為true后,會(huì)出現(xiàn)一個(gè)加號(hào)的column,它能夠?qū)olumn進(jìn)行過(guò)濾?
table默認(rèn)是僅僅能選著一行的,假設(shè)想選著多行。設(shè)置SelectionMode,此時(shí)能夠?qū)x中的多個(gè)進(jìn)行監(jiān)聽(tīng)。
Java代碼?? ListChangeListener<Person>?indicesListener?=?new???ListChangeListener<Person>()?{?? ???????????@Override?public?void?onChanged(Change<??extends?Person>?c)?{?? ???????????????while?(c.next())?{?? ?????????????????? ???????????????????selectionUpdated(c.getAddedSubList(),?c.getRemoved());?? ???????????????}?? ???????????}?? ???????};?? ???????tableView.getSelectionModel().getSelectedItems().addListener(indicesListener);?? ???????tableView.getSelectionModel().setSelectionMode(SelectionMode.MULTIPLE);??
tableView.getSelectionModel()得到的是個(gè)抽象類(lèi)SelectionModel。它有二個(gè)子類(lèi)MultipleSelectionModel, SingleSelectionModel。
Java代碼?? getSelectedIndex()??? getSelectedItem()??? selectedIndexProperty()??? selectedItemProperty()???
獲取選中的item和索引。一個(gè)是獲取其值,還有一個(gè)是獲取封裝屬性,用于bind變化。
Java代碼?? select(int?index)??? select(T?obj)??? selectFirst()??? selectLast()??? ...?? clearSelection()??? clearSelection(int?index)???
這些方法都是操作選中。?
Java代碼?? setSelectionMode(SelectionMode.MULTIPLE);?? selectIndices(int?index,?int...?indices)??? selectRange(int?start,?int?end)???
MultipleSelectionModel則提供多選功能,而且提供多選的一些方法。?
Java代碼?? select(int?row,?TableColumn<S,? selectAboveCell()??? selectBelowCell()?? selectLeftCell()??? selectRightCell()???? setCellSelectionEnabled(boolean?value)???
TableView.TableViewSelectionModel<S>是繼承了MultipleSelectionModel,主要針對(duì)table的選中事件提供了一些方法。?
這里有非常多javafx的小游戲,一個(gè)高手寫(xiě)的?
http://lustrezhang.gotoip4.com/fxgame/?
這里有個(gè)javafx學(xué)習(xí)的中文站點(diǎn),我把內(nèi)容都丟那上面去了。?
http://www.jfxee.com/
?? TableColumn列?
構(gòu)建一個(gè)表主要有TableView,TableColumn,ObservableList,Bean。?
加入列table.getColumns().addAll(firstNameCol, lastNameCol, emailCol);?
ObservableList里面是存放的數(shù)據(jù)?
table.setItems(observableList);加入數(shù)據(jù)?
observableList里面通常是存放的Bean,列與Bean之間建立聯(lián)系,從而獲取值。?
列與Bean之間建立聯(lián)系:?
emailCol.setCellValueFactory(new PropertyValueFactory<Person, String>("email"));通過(guò)cell值工廠建立與Bean的聯(lián)系。它這里并不須要知道你是傳了什么Bean,它僅僅須要通過(guò)“email”反射成getEmail()方法去Bean里面獲得值,所以Bean屬性定義的名字不須要與它同樣,僅僅須要有g(shù)etEmail()方法。
?
Java代碼??
arg0.getValue()等于這里的person。若是你observableList.add(list),則這arg0.getValue()等于list。?
SimpleStringProperty(arg0.getValue(),"sd",arg0.getValue().getFirstName());?
這里的意思既是arg0.getValue()既是你observableList.add的值。“sd”為bean取得名字,arg0.getValue().getFirstName()既是你該列想要獲得的值。假設(shè)是list則arg0.getValue().get(j)則為該列的每行賦值了。?
cell里面不僅僅僅存放文字,還能夠存放其他Node:?
Java代碼??
和TreeCell使用一樣,能夠?qū)ell里面弄又一次構(gòu)造。
?
lastNameCol.setCellFactory(TextFieldTableCell.forTableColumn());有一些默認(rèn)的構(gòu)造,就不須要自己去new TableCell了。?
TableColumn設(shè)置sort的3個(gè)方法?
firstNameCol.setSortNode(new Text("a")); // 默認(rèn)是表頭上的小圖標(biāo)三角形,能夠改變?
firstNameCol.setSortable(true); // 設(shè)置可排序?
firstNameCol.setSortType(SortType.DESCENDING);設(shè)置升降序?
若要在一個(gè)column中包括多個(gè)column。則能夠調(diào)用TableColumn的getColumns().setAll(TableColumn...);?
Java代碼??
table的單元之間有明顯的橫線切割,能夠通過(guò)css去掉。
?
去掉行橫線?
Java代碼??
若想同一時(shí)候去掉沒(méi)有數(shù)據(jù)的豎線?
Java代碼??
若想對(duì)行進(jìn)行操作,能夠通過(guò)setRowFactory。如以下對(duì)行的雙擊進(jìn)行操作?
Java代碼??
往table中插入數(shù)據(jù)。table中的數(shù)據(jù)顯示,是依據(jù)你的itemlist來(lái)的。list里面的數(shù)據(jù)排什么序,那table也就排什么序。若加入一條新數(shù)據(jù),直接往list里面加。
而list又提供按位置加,那么table顯示就是按位置加了。?
Java代碼??
newRecord一個(gè)新的對(duì)象,沒(méi)賦值。?
自己定義TableCell一般都是重寫(xiě)updateItem方法。假設(shè)有須要在編輯做操作,能夠重寫(xiě)startEdit,cancelEdit?
Java代碼??
能夠看到,一旦點(diǎn)擊編輯狀態(tài),則改變Cell里面的內(nèi)容。一離開(kāi)編輯就換成原本cell里面的內(nèi)容。這樣就能夠顯示的時(shí)候就是字符串,而編輯的時(shí)候就能夠弄一個(gè)控件。如日歷。?
獲取選中的TableColumn?
Java代碼??
table自帶方法能夠過(guò)濾column,也就是僅僅顯示哪些column?
Java代碼??
設(shè)置為true后,會(huì)出現(xiàn)一個(gè)加號(hào)的column,它能夠?qū)olumn進(jìn)行過(guò)濾?
table默認(rèn)是僅僅能選著一行的,假設(shè)想選著多行。設(shè)置SelectionMode,此時(shí)能夠?qū)x中的多個(gè)進(jìn)行監(jiān)聽(tīng)。
?
Java代碼??
tableView.getSelectionModel()得到的是個(gè)抽象類(lèi)SelectionModel。它有二個(gè)子類(lèi)MultipleSelectionModel, SingleSelectionModel。
它們主要處理選擇事件,能夠看它們的方法:?
Java代碼??
獲取選中的item和索引。一個(gè)是獲取其值,還有一個(gè)是獲取封裝屬性,用于bind變化。
?
Java代碼??
這些方法都是操作選中。?
Java代碼??
MultipleSelectionModel則提供多選功能,而且提供多選的一些方法。?
Java代碼??
>?column)???
TableView.TableViewSelectionModel<S>是繼承了MultipleSelectionModel,主要針對(duì)table的選中事件提供了一些方法。?
這里有非常多javafx的小游戲,一個(gè)高手寫(xiě)的?
http://lustrezhang.gotoip4.com/fxgame/?
這里有個(gè)javafx學(xué)習(xí)的中文站點(diǎn),我把內(nèi)容都丟那上面去了。?
http://www.jfxee.com/
總結(jié)
以上是生活随笔為你收集整理的JavaFX学习之道:JavaFX之TableView的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。
- 上一篇: 小白学习IOT之模拟设备RRPC命令下发
- 下一篇: 关于开源软件的思考