You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.18 20:15:07