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()方法。
- 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:
- 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...);
- 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去掉。
去掉行橫線
- .table-view .table-row-cell {
- -fx-background-insets: 0;
- }
若想同一時候去掉沒有數據的豎線
- .table-row-cell:empty .table-cell {
- -fx-border-width: 0px;
- }
若想對行進行操作,能夠通過setRowFactory。如以下對行的雙擊進行操作
- 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里面加。
而list又提供按位置加,那么table顯示就是按位置加了。
- tableView.getItems().add(selectedRow, newRecord);
newRecord一個新的對象,沒賦值。
自己定義TableCell一般都是重寫updateItem方法。假設有須要在編輯做操作,能夠重寫startEdit,cancelEdit
- @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
- table.getSelectionModel().getSelectedCells().get(0).getTableColumn()
table自帶方法能夠過濾column,也就是僅僅顯示哪些column
- table.setTableMenuButtonVisible(true);
設置為true后,會出現一個加號的column,它能夠對column進行過濾
table默認是僅僅能選着一行的,假設想選着多行。設置SelectionMode,此時能夠對選中的多個進行監聽。
- 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。
它們主要處理選擇事件,能夠看它們的方法:
- getSelectedIndex()
- getSelectedItem()
- selectedIndexProperty()
- selectedItemProperty()
獲取選中的item和索引。一個是獲取其值,還有一個是獲取封裝屬性,用於bind變化。
- select(int index)
- select(T obj)
- selectFirst()
- selectLast()
- ...
- clearSelection()
- clearSelection(int index)
這些方法都是操作選中。
- setSelectionMode(SelectionMode.MULTIPLE);
- selectIndices(int index, int... indices)
- selectRange(int start, int end)
MultipleSelectionModel則提供多選功能,而且提供多選的一些方法。
- select(int row, TableColumn<S,?
> column)
- selectAboveCell()
- selectBelowCell()
- selectLeftCell()
- selectRightCell()
- setCellSelectionEnabled(boolean value)
TableView.TableViewSelectionModel<S>是繼承了MultipleSelectionModel,主要針對table的選中事件提供了一些方法。
這里有非常多javafx的小游戲,一個高手寫的
http://lustrezhang.gotoip4.com/fxgame/
這里有個javafx學習的中文站點,我把內容都丟那上面去了。
http://www.jfxee.com/

