【问题标题】:JavaFX TableView seperate bean adapter for each row. How?JavaFX TableView 为每一行单独的 bean 适配器。如何?
【发布时间】:2017-04-19 12:03:57
【问题描述】:

在将 bean 适配器对象绑定到 TableView 时遇到问题,TableView 会使用该适配器属性创建组合框。

lanSpecie.setCellFactory(new Callback<TableColumn<HAUL,Specie>, TableCell<HAUL,Specie>>() {
    @Override
    public TableCell<HAUL, Specie> call(TableColumn<HAUL, Specie> param) {
        TableCell<HAUL, Specie> cell = new TableCell<>();
        ComboBox<Specie> comboBox = new ComboBox<>(FXCollections.observableList(specieService.findAllAdded()));
            try {
                comboBox.valueProperty().bindBidirectional(new JavaBeanObjectPropertyBuilder<Object>().bean(haulBean).name("specie").build());
            } catch (NoSuchMethodException e) {
                e.printStackTrace();
            }
            cell.graphicProperty().bind(Bindings.when(cell.emptyProperty()).then((Node) null).otherwise(comboBox));
            return cell;
        }
    });

我的表添加了 3 行:

每当我更改一个元素时,它都会自动更改所有 3 个。

寻找解决方案或指导正确的方向,以便表格将每个行元素作为新的 HAUL 对象查找,从而为每行创建新的适配器实例。

【问题讨论】:

  • 该代码中的haulBean 是什么?看起来您正在将所有组合框的值绑定到单个属性。你不能在这里使用标准的ComboBoxTableCell 吗?
  • haulBean 是我的实体对象(本例中为 POJO)。可以将 javabean 适配器字段绑定到 ComboBoxTableCell 吗?
  • 但是哪个实体对象?每行都有一个。这真的没有意义。您应该使用单元格 value 工厂映射到 Java Bean Adapter,然后使用单元格工厂指定表格单元格。我看不出有任何理由不适用于ComboBoxTableCell
  • 喜欢这个? link
  • 有点,但看起来您对每一行都使用相同的值:haulBean 仍然是一个固定行的值。你肯定想要new JavaBeanObjectPropertyBuilder&lt;Object&gt;().bean(param.getValue())...

标签: java javafx combobox tableview javabeans


【解决方案1】:

当单元格需要显示新值时(例如,当单元格初始化时,如果属性更改,如果单元格被重新用于新值, ETC)。您可以使用cellValueFactory 控制传递到单元格的

lanSpecie.setCellValueFactory(cellData -> 
    new JavaBeanObjectPropertyBuilder<Specie>()
        .bean(cellData.getValue())
        .name("specie")
        .build());

完成后,您可以使用标准 ComboBoxTableCell 获得单元所需的功能:

lanSpecie.setCellFactory(ComboBoxTableCell.forTableColumn(
    FXCollections.observableList(specieService.findAllAdded()));

ComboBoxTableCell 正在做一些你会得到的事情:

lanSpecie.setCellFactory(column -> new TableCell<HAUL, Specie>() {
    private final ComboBox<Specie> comboBox = new ComboBox<>();

    {
        comboBox.setItems(FXCollections.observableList(specieService.findAllAdded()));
        comboBox.setOnAction(e -> commitEdit(comboBox.getValue()));
    }

    @Override
    protected void updateItem(Specie specie, boolean empty) {
        super.updateItem(specie, empty);
        if (empty) {
            setGraphic(null);
        } else {
            comboBox.setValue(specie);
            setGraphic(comboBox);
        }
    }
});

lanSpecie.setOnEditCommit(event -> {
    HAUL haul = event.getRowValue();
    haul.setSpecie(event.getNewValue());
});

【讨论】:

  • 非常感谢!有没有办法,我可以使用 ComboBox 而不是 ComboBoxTableCell 并将其 value 属性绑定到我的 JavabeanObjectProperty?
  • @Kefirchiks 好吧,组合框表格单元格完全适合您,但如果您真的愿意,您可以自己(重新)实现它。我不认为你可以使用绑定,本质上,因为单元格值工厂每次调用时都必须创建一个新的属性实例,所以你需要监听器。
  • @Kefirchiks 查看更新以自己实现单元格的示例。这个单元实现有点基本,不会像标准单元那样进出编辑状态,但它应该可以工作(未经测试)。
  • this 一样使用它,但我有一个问题。它加载多次。每当我更改值时,我的更改侦听器都会在控制台中显示this,并且值已多次更改。
猜你喜欢
  • 2014-12-23
  • 1970-01-01
  • 1970-01-01
  • 2017-01-14
  • 1970-01-01
  • 2015-03-12
  • 2014-04-29
  • 2016-04-28
  • 2014-02-22
相关资源
最近更新 更多