每行JavaFX TableView单独的bean适配器。怎么样?

时间:2017-04-19 12:03:57

标签: java javafx combobox tableview javabeans

将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行的我的表格:

Haul table

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

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

1 个答案:

答案 0 :(得分:2)

当单元格需要显示新值时,单元格的各个值将被传递到单元格的updateItem(...)方法中(例如,当单元格被初始化时,如果属性发生变化,如果单元格是重用于新值等)。您可以使用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());
});