繁体   English   中英

JavaFX 8:遍历TableView单元并获取图形

[英]JavaFX 8 : Iterate through TableView cells and get graphics

我在访问TableColumn中显示的对象时遇到麻烦

这是我设置一栏图形的代码段。 只想显示“人”对象的名称:(欢迎使用任何更好/更简便的方法)

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()?

任何类型的单元格内容的静态方法。

方法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;
  }

这种访问单元的方法将不起作用,因为CellFactory不会用于为每一行生成1:1单元。 该单元仅用作轻量级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()方法。

正如詹斯·彼得(Jens-Peter)所说,表格中的单元格与项目之间没有1-1的对应关系,因此获取单元格的方法将行不通。

您应该认为table.getItems()具有显示的数据。 表,表列和表单元格只是这些数据的可视化。 请参考实际数据,而不是具体的可视化:

for (Site site : tableView.getItems()) {
    // owner column data:
    Person owner = site.getOwner();
    String ownerName = owner.getName();
    // ...
}

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM