Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/loops/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Loops JavaFX8:遍历TableView单元格并获取图形_Loops_Javafx_Tableview_Javafx 8 - Fatal编程技术网

Loops JavaFX8:遍历TableView单元格并获取图形

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

访问TableColumn中显示的对象时遇到问题

下面是我设置一列图形的代码片段。只想显示Person对象的名称:(欢迎使用更好/更简单的方法)


所以问题是,如何获取我在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;
  }