JavaFX如何为TableView动态添加可编辑列并更新单元格内容
核心修改代码(Controller的initialize方法内的循环部分)
你原有代码存在两个需要先修复的问题:
- 所有
Ingredient共用同一个nutrientsList实例,修改任意一行的营养值会同步修改所有行,需要为每个Ingredient单独创建营养列表副本 - 动态列的
selectedIngredient在初始化时获取,值始终为null,需要从编辑事件中取当前操作的行数据
修改后的完整循环代码:
for (int i = 0; i < nutrientsList.size(); i++) { int currentNutrientIndex = i; // 列存储的是Double类型的weight值 TableColumn<Ingredient, Double> column = new TableColumn<>(nutrientsList.get(i).getName()); tableView.getColumns().add(column); // 设置CellValueFactory:获取对应索引的营养重量 column.setCellValueFactory(cellData -> { Ingredient ingredient = cellData.getValue(); return ingredient.getNutrientAt(currentNutrientIndex).weightProperty().asObject(); }); // 设置可编辑的TextField单元格,添加String和Double的转换器 column.setCellFactory(TextFieldTableCell.forTableColumn(new javafx.util.converter.DoubleStringConverter())); // 设置编辑提交事件 column.setOnEditCommit(event -> { // 从事件中获取当前操作的Ingredient,不要用全局选中的 Ingredient currentIngredient = event.getRowValue(); currentIngredient.updateNutrientValue(currentNutrientIndex, event.getNewValue()); // 可选:打印验证修改结果 ingredientsList.forEach(System.out::println); }); // 允许列编辑 column.setEditable(true); }
修复Ingredient共用营养列表的问题
原有初始化的ingredientsList.forEach(nutrient -> nutrient.setNutrients(nutrientsList));需要替换为每个Ingredient单独创建副本:
// 替换原有赋值营养列表的代码 ingredientsList.forEach(ingredient -> { ArrayList<Nutrient> copy = new ArrayList<>(); for (Nutrient n : nutrientsList) { copy.add(new Nutrient(n.getName(), n.getWeight())); } ingredient.setNutrients(copy); });
修改完成后即可实现点击营养列单元格输入数值,自动更新对应Ingredient的Nutrient的weight属性,编辑逻辑和Name列完全一致。
内容的提问来源于stack exchange,提问作者ovi_b
相关产品推荐
相关产品推荐

