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()方法。
css
firstNameCol.setCellValueFactory(new Callback<TableColumn.CellDataFeatures<Person, String>, ObservableValue<String>>() { this
@Override spa
public ObservableValue<String> call(CellDataFeatures<Person, String> arg0) { 對象
// return new blog
// 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的選中事件提供了一些方法。