JavaFX TableView 为每一行单独的 bean 适配器。如何?

JavaFX TableView seperate bean adapter for each row. How?

在将 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;
        }
    });

我的 table 添加了 3 行:

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

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

当单元格需要显示新值时(例如,初始化单元格时,如果 属性 更改,如果单元格被重新用于新值等)。您可以使用 cellValueFactory:

控制传递到单元格中的 value
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());
});