JavaFX学习之道:JavaFX之TableView
生活随笔
收集整理的這篇文章主要介紹了
JavaFX学习之道:JavaFX之TableView
小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
?TableView表?
?? TableColumn列?
構建一個表主要有TableView,TableColumn,ObservableList,Bean。?
加入列table.getColumns().addAll(firstNameCol, lastNameCol, emailCol);?
ObservableList里面是存放的數據?
table.setItems(observableList);加入數據?
observableList里面通常是存放的Bean,列與Bean之間建立聯系,從而獲取值。?
列與Bean之間建立聯系:?
emailCol.setCellValueFactory(new PropertyValueFactory<Person, String>("email"));通過cell值工廠建立與Bean的聯系。它這里并不須要知道你是傳了什么Bean,它僅僅須要通過“email”反射成getEmail()方法去Bean里面獲得值,所以Bean屬性定義的名字不須要與它同樣,僅僅須要有getEmail()方法。
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的名稱,值?? return?new?SimpleStringProperty(arg0.getValue().getFirstName());??? //?這樣你能夠不建立值與對象的映射關系。?? ????}?? });??
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()既是你該列想要獲得的值。假設是list則arg0.getValue().get(j)則為該列的每行賦值了。?
cell里面不僅僅僅存放文字,還能夠存放其他Node:?
Java代碼?? firstNameCol.setCellFactory(new?Callback<TableColumn<Person,?String>,?TableCell<Person,?String>>()?{?? ????@Override?? ????public?TableCell<Person,?String>?call(?//?單元格內容?? ????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使用一樣,能夠對cell里面弄又一次構造。
lastNameCol.setCellFactory(TextFieldTableCell.forTableColumn());有一些默認的構造,就不須要自己去new TableCell了。?
TableColumn設置sort的3個方法?
firstNameCol.setSortNode(new Text("a")); // 默認是表頭上的小圖標三角形,能夠改變?
firstNameCol.setSortable(true); // 設置可排序?
firstNameCol.setSortType(SortType.DESCENDING);設置升降序?
若要在一個column中包括多個column。則能夠調用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的單元之間有明顯的橫線切割,能夠通過css去掉。
去掉行橫線?
Java代碼?? .table-view?.table-row-cell?{?? ????-fx-background-insets:?0;?? }??
若想同一時候去掉沒有數據的豎線?
Java代碼?? .table-row-cell:empty?.table-cell?{?? ????-fx-border-width:?0px;?? }??
若想對行進行操作,能夠通過setRowFactory。如以下對行的雙擊進行操作?
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中插入數據。table中的數據顯示,是依據你的itemlist來的。list里面的數據排什么序,那table也就排什么序。若加入一條新數據,直接往list里面加。
Java代碼?? tableView.getItems().add(selectedRow,?newRecord);??
newRecord一個新的對象,沒賦值。?
自己定義TableCell一般都是重寫updateItem方法。假設有須要在編輯做操作,能夠重寫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);?? ??????}??
能夠看到,一旦點擊編輯狀態,則改變Cell里面的內容。一離開編輯就換成原本cell里面的內容。這樣就能夠顯示的時候就是字符串,而編輯的時候就能夠弄一個控件。如日歷。?
獲取選中的TableColumn?
Java代碼?? table.getSelectionModel().getSelectedCells().get(0).getTableColumn()??
table自帶方法能夠過濾column,也就是僅僅顯示哪些column?
Java代碼?? table.setTableMenuButtonVisible(true);??
設置為true后,會出現一個加號的column,它能夠對column進行過濾?
table默認是僅僅能選著一行的,假設想選著多行。設置SelectionMode,此時能夠對選中的多個進行監聽。
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()得到的是個抽象類SelectionModel。它有二個子類MultipleSelectionModel, SingleSelectionModel。
Java代碼?? getSelectedIndex()??? getSelectedItem()??? selectedIndexProperty()??? selectedItemProperty()???
獲取選中的item和索引。一個是獲取其值,還有一個是獲取封裝屬性,用于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,主要針對table的選中事件提供了一些方法。?
這里有非常多javafx的小游戲,一個高手寫的?
http://lustrezhang.gotoip4.com/fxgame/?
這里有個javafx學習的中文站點,我把內容都丟那上面去了。?
http://www.jfxee.com/
?? TableColumn列?
構建一個表主要有TableView,TableColumn,ObservableList,Bean。?
加入列table.getColumns().addAll(firstNameCol, lastNameCol, emailCol);?
ObservableList里面是存放的數據?
table.setItems(observableList);加入數據?
observableList里面通常是存放的Bean,列與Bean之間建立聯系,從而獲取值。?
列與Bean之間建立聯系:?
emailCol.setCellValueFactory(new PropertyValueFactory<Person, String>("email"));通過cell值工廠建立與Bean的聯系。它這里并不須要知道你是傳了什么Bean,它僅僅須要通過“email”反射成getEmail()方法去Bean里面獲得值,所以Bean屬性定義的名字不須要與它同樣,僅僅須要有getEmail()方法。
?
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()既是你該列想要獲得的值。假設是list則arg0.getValue().get(j)則為該列的每行賦值了。?
cell里面不僅僅僅存放文字,還能夠存放其他Node:?
Java代碼??
和TreeCell使用一樣,能夠對cell里面弄又一次構造。
?
lastNameCol.setCellFactory(TextFieldTableCell.forTableColumn());有一些默認的構造,就不須要自己去new TableCell了。?
TableColumn設置sort的3個方法?
firstNameCol.setSortNode(new Text("a")); // 默認是表頭上的小圖標三角形,能夠改變?
firstNameCol.setSortable(true); // 設置可排序?
firstNameCol.setSortType(SortType.DESCENDING);設置升降序?
若要在一個column中包括多個column。則能夠調用TableColumn的getColumns().setAll(TableColumn...);?
Java代碼??
table的單元之間有明顯的橫線切割,能夠通過css去掉。
?
去掉行橫線?
Java代碼??
若想同一時候去掉沒有數據的豎線?
Java代碼??
若想對行進行操作,能夠通過setRowFactory。如以下對行的雙擊進行操作?
Java代碼??
往table中插入數據。table中的數據顯示,是依據你的itemlist來的。list里面的數據排什么序,那table也就排什么序。若加入一條新數據,直接往list里面加。
而list又提供按位置加,那么table顯示就是按位置加了。?
Java代碼??
newRecord一個新的對象,沒賦值。?
自己定義TableCell一般都是重寫updateItem方法。假設有須要在編輯做操作,能夠重寫startEdit,cancelEdit?
Java代碼??
能夠看到,一旦點擊編輯狀態,則改變Cell里面的內容。一離開編輯就換成原本cell里面的內容。這樣就能夠顯示的時候就是字符串,而編輯的時候就能夠弄一個控件。如日歷。?
獲取選中的TableColumn?
Java代碼??
table自帶方法能夠過濾column,也就是僅僅顯示哪些column?
Java代碼??
設置為true后,會出現一個加號的column,它能夠對column進行過濾?
table默認是僅僅能選著一行的,假設想選著多行。設置SelectionMode,此時能夠對選中的多個進行監聽。
?
Java代碼??
tableView.getSelectionModel()得到的是個抽象類SelectionModel。它有二個子類MultipleSelectionModel, SingleSelectionModel。
它們主要處理選擇事件,能夠看它們的方法:?
Java代碼??
獲取選中的item和索引。一個是獲取其值,還有一個是獲取封裝屬性,用于bind變化。
?
Java代碼??
這些方法都是操作選中。?
Java代碼??
MultipleSelectionModel則提供多選功能,而且提供多選的一些方法。?
Java代碼??
>?column)???
TableView.TableViewSelectionModel<S>是繼承了MultipleSelectionModel,主要針對table的選中事件提供了一些方法。?
這里有非常多javafx的小游戲,一個高手寫的?
http://lustrezhang.gotoip4.com/fxgame/?
這里有個javafx學習的中文站點,我把內容都丟那上面去了。?
http://www.jfxee.com/
總結
以上是生活随笔為你收集整理的JavaFX学习之道:JavaFX之TableView的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 小白学习IOT之模拟设备RRPC命令下发
- 下一篇: Java并发编程(三)volatile域