emailCol.setCellValueFactory(new PropertyValueFactory("email"));通过cell值工厂建立与Bean的联系。它这里并不须要知道你是传了什么Bean,它仅仅须要通过“email”反射成getEmail()方法去Bean里面获得值,所以Bean属性定义的名字不须要与它同样,仅仅须要有getEmail()方法。
Java代码
firstNameCol.setCellValueFactory(new Callback, ObservableValue>() {
@Override
public ObservableValue call(CellDataFeatures 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, TableCell>() {
@Override
public TableCell call( // 单元格内容
TableColumn arg0) {
return new TableCell() { @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("First");
firstNameColumn.setCellValueFactory(new PropertyValueFactory("firstName"));
// firstNameColumn.setCellFactory(TextFieldCellFactory.forTableColumn());
lastNameColumn = new TableColumn("Last");
lastNameColumn.setCellValueFactory(new PropertyValueFactory("lastName"));
// lastNameColumn.setCellFactory(TextFieldCellFactory.forTableColumn());
nameColumn = new TableColumn("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, TableRow>() {
@Override
public TableRow call(TableView param) {
return new TableRowControl();
}
});
class TableRowControl extends TableRow {
public TableRowControl() {
super();
this.setOnMouseClicked(new EventHandler() {
@Override
public void handle(MouseEvent event) {
if (event.getButton().equals(MouseButton.PRIMARY)
&& event.getClickCount() == 2
&& TableRowControl.this.getIndex()
//doSomething
}
}
});
}
}
往table中插入数据。table中的数据显示,是依据你的itemlist来的。list里面的数据排什么序,那table也就排什么序。若加入一条新数据,直接往list里面加。
而list又提供按位置加,那么table显示就是按位置加了。
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 indicesListener = new ListChangeListener() {
@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
> column)
selectAboveCell()
selectBelowCell()
selectLeftCell()
selectRightCell()
setCellSelectionEnabled(boolean value)
TableView.TableViewSelectionModel是继承了MultipleSelectionModel,主要针对table的选中事件提供了一些方法。
这里有非常多javafx的小游戏,一个高手写的
http://lustrezhang.gotoip4.com/fxgame/
这里有个javafx学习的中文站点,我把内容都丢那上面去了。
http://www.jfxee.com/