将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对象查找,从而为每一行创建新的适配器实例。
答案 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());
});