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()方法。
-
firstNameCol.setCellValueFactory(new Callback<TableColumn.CellDataFeatures<Person, String>, ObservableValue<String>>() {
-
@Override
-
public ObservableValue<String> call(CellDataFeatures<Person, String> arg0) {
-
-
-
-
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"));
-
-
-
lastNameColumn = new TableColumn<Person, String>("Last");
-
lastNameColumn.setCellValueFactory(new PropertyValueFactory<Person, String>("lastName"));
-
-
-
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()) {
-
-
}
-
}
-
});
-
}
-
}
往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/JavaFX学习之道:JavaFX之TableView,布布扣,bubuko.com
JavaFX学习之道:JavaFX之TableView
原文:http://blog.csdn.net/u011511429/article/details/38275759