Loops JavaFX8:遍历TableView单元格并获取图形
访问TableColumn中显示的对象时遇到问题 下面是我设置一列图形的代码片段。只想显示Person对象的名称:(欢迎使用更好/更简单的方法)Loops JavaFX8:遍历TableView单元格并获取图形,loops,javafx,tableview,javafx-8,Loops,Javafx,Tableview,Javafx 8,访问TableColumn中显示的对象时遇到问题 下面是我设置一列图形的代码片段。只想显示Person对象的名称:(欢迎使用更好/更简单的方法) 所以问题是,如何获取我在CellFactory中设置的getGraphics()。这种访问单元格的方法不起作用,因为CellFactory不会为每行生成1:1的单元格。该单元仅用作轻量级视图生成器,将被大量重用 顺便说一下,您可以使用: @Override protected void updateItem(Person item, boolean e
所以问题是,如何获取我在CellFactory中设置的getGraphics()。这种访问单元格的方法不起作用,因为CellFactory不会为每行生成1:1的单元格。该单元仅用作轻量级视图生成器,将被大量重用 顺便说一下,您可以使用:
@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()方法。正如Jens-Peter所说,单元格和表中的项目之间没有1-1对应关系,因此获取单元格的方法将不起作用 您应该将
table.getItems()
视为具有显示的数据。表、表列和表单元格只是这些数据的可视化。参考实际数据,而不是具体的可视化数据:
for (Site site : tableView.getItems()) {
// owner column data:
Person owner = site.getOwner();
String ownerName = owner.getName();
// ...
}
用于任何类型单元格内容的静态方法 方法getItems()获取属性项的值。财产是 TableView的基础数据模型。请注意,它有一个 必须与TableView本身的类型匹配的泛型类型
私有静态ArrayList getTableViewValues(TableView TableView){
ArrayList值=新的ArrayList();
ObservableList columns=tableView.getColumns();
对于(对象行:tableView.getItems()){
for(表列:列){
value.add(
(字符串)列。
getCellObservableValue(行)。
getValue());
}
}
返回值;
}
谢谢Jens,感谢您的回答。我一定会尝试这种方法,如何设置一个复选框来可视化布尔值?我做的和我原来的帖子一样,只是用一个复选框而不是标签。我来自C#,在那里我可以轻松地访问向用户显示的内容。但我真的很努力地用JavaFXTableView来实现它。问题是,我希望有一个PDF报告生成器,它以TableView为参数,并以PDF形式生成该报表的表示形式,但由于我的问题,我无法访问显示的对象。有关复选框,请参见:,您必须使用setGraphics()方法…您不需要调用setGraphic()
。只需使用并提供。无论采用哪种方式设置文本,我仍然无法访问TabelColumn的getGraphics我的计划是什么。将检查您设置TableCell的方式是否更好。也谢谢您,James。除了我对Jens答案的评论之外,我知道这将是一个毫无疑问的解决方案,但我的目标是获得一个reporter类,该类将TableView作为参数,并在可视化的基础上生成PDF,无论文本、复选框或任何其他内容。当然,我必须根据可视化对象的类型来显示它,但显然这行不通……你想要一个截图,还是想提供数据的另一种视图(pdf格式)?我需要有一个pdf格式的不同选项卡视图的“打印输出”,我开始使用iText,似乎很容易处理。tableView.getItems返回对象,所以我不确定这是否会发生work@serup不,它返回一个。假设您的表声明正确(即作为TableView
),那么它将返回一个observeList
,代码将正常工作。
@Override
protected void updateItem(Person item, boolean empty) {
super.updateItem(item, empty);
if (item != null && !empty) {
setText(item.getName());
} else {
setText(null);
}
}
for (Site site : tableView.getItems()) {
// owner column data:
Person owner = site.getOwner();
String ownerName = owner.getName();
// ...
}
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;
}