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