我无法访问TableColumn中显示的对象
这是我设置一列图形的代码片段。只想显示Person对象的名称:(欢迎使用任何更好/更简单的方法)
ownerColumn
.setCellFactory(new Callback<TableColumn<Site, Person>, TableCell<Site, Person>>() {
@Override
public TableCell<Site, Person> call(
TableColumn<Site, Person> param) {
TableCell<Site, Person> ownerCell = new TableCell<Site, Person>() {
@Override
protected void updateItem(Person item, boolean empty) {
if (item != null) {
Label label = new Label(item.getName());
setGraphic(label);
}
}
};
return ownerCell;
}
});
现在,我试图循环遍历行和列,让每个单元格在最后生成报告,反映Tableview中显示的文本/图形。喜欢这个
for (Object r : this.tableview.getItems()) {
for (Object c : this.tableview.getColumns()) {
javafx.scene.control.TableColumn column = (javafx.scene.control.TableColumn) c;
if (column.getCellData(r) != null) {
// I get the object bound to the cell here, but I only want
// to have what i've set as graphics - what the user sees on UI
// How to use getGraphics() ?
}
}
}
所以问题是,我如何获得我在CellFactory中设置的getGraphics()?
答案 0 :(得分:2)
任何类型的单元格内容的静态方法。
方法getItems()获取属性项的值。财产是 TableView的基础数据模型。请注意,它有一个 必须与TableView本身类型匹配的泛型类型。
private static ArrayList<String> getTableViewValues(TableView tableView) {
ArrayList<String> values = new ArrayList<>();
ObservableList<TableColumn> columns = tableView.getColumns();
for (Object row : tableView.getItems()) {
for (TableColumn column : columns) {
values.add(
(String) column.
getCellObservableValue(row).
getValue());
}
}
return values;
}
答案 1 :(得分:1)
这种访问Cell的方法不起作用,因为CellFactory不会用于为每一行生成1:1的Cell。 Cell仅用作轻量级View生成器,将重复使用。
顺便提一句:
@Override
protected void updateItem(Person item, boolean empty) {
super.updateItem(item, empty);
if (item != null && !empty) {
setText(item.getName());
} else {
setText(null);
}
}
只会显示文字。
a)同时检查布尔值空
b)由于重复使用案例,明确地清除将要设置的所有图形/文本(在此测试)!
c)始终调用super udateItem()方法。
答案 2 :(得分:1)
正如Jens-Peter所说,表格中的单元格和项目之间没有1-1的对应关系,因此获取单元格的方法不起作用。
您应该将table.getItems()
视为拥有显示的数据。表,表列和表格单元格只是这些数据的可视化。请参考实际数据,而不是具体的可视化数据:
for (Site site : tableView.getItems()) {
// owner column data:
Person owner = site.getOwner();
String ownerName = owner.getName();
// ...
}