JavaFX可编辑TableView编辑后获旧值及获取最后编辑项问题
解决JavaFX TableView编辑后值不同步+获取最后编辑项的问题
嘿,我之前也碰到过TableView编辑后界面显示新值但数据源还是旧值的坑,其实核心问题就是编辑操作没有把新值同步到你的后台数据模型里,界面显示的只是单元格的临时值而已。下面给你一步步解决:
一、先搞定编辑后值不更新的问题
方案1:用JavaFX ObservableProperty做数据模型(推荐)
如果你的行数据类(比如对应预订项的类,假设叫ReservationItem)用JavaFX的可观察属性,TableView会自动双向绑定,编辑后直接同步到模型里:
// 你的行数据类示例 public class ReservationItem { // 用IntegerProperty替代普通int,支持自动通知更新 private final IntegerProperty reservedPlaces = new SimpleIntegerProperty(); // 标准的get/set方法 public int getReservedPlaces() { return reservedPlaces.get(); } public void setReservedPlaces(int value) { reservedPlaces.set(value); } // 必须提供这个property方法,供TableView绑定 public IntegerProperty reservedPlacesProperty() { return reservedPlaces; } }
然后配置TableView的列:
// 初始化「Nombre de places à réserver」列 TableColumn<ReservationItem, Integer> placesColumn = new TableColumn<>("Nombre de places à réserver"); // 绑定到数据模型的可观察属性 placesColumn.setCellValueFactory(cellData -> cellData.getValue().reservedPlacesProperty().asObject()); // 设置为可编辑的文本单元格,用Integer转换器处理字符串和数字的转换 placesColumn.setCellFactory(TextFieldTableCell.forTableColumn(new IntegerStringConverter())); placesColumn.setEditable(true);
这样编辑完成后(比如按回车或点击其他单元格),数据模型会自动更新,你再获取TableView的getItems()时,拿到的就是新值了。
方案2:手动监听编辑提交事件(适合普通POJO模型)
如果你的数据模型是普通的POJO(只有普通get/set方法,没用ObservableProperty),那得手动监听编辑提交事件,把新值塞回模型:
placesColumn.setOnEditCommit(event -> { // 获取当前编辑的行对象 ReservationItem editedItem = event.getRowValue(); // 获取编辑后的新值 int newPlaceCount = event.getNewValue(); // 手动更新模型的属性 editedItem.setReservedPlaces(newPlaceCount); });
这里要注意:默认情况下,编辑提交需要用户触发(比如按回车),如果想让单元格失去焦点就提交,可以自定义单元格的行为,或者在单元格的onEditCancel里也处理提交(不过不推荐,最好让用户明确触发提交)。
二、获取最后编辑的项
这个很简单,在控制器里加个成员变量保存最后编辑的对象,然后在编辑提交事件里赋值就行:
public class ReserverWindowController { private SpectacleDto spectacleToReserve; // 新增成员变量,保存最后编辑的项 private ReservationItem lastEditedItem; // ... 其他初始化代码 public void initialize() { // 初始化列的时候绑定编辑提交事件 TableColumn<ReservationItem, Integer> placesColumn = new TableColumn<>("Nombre de places à réserver"); // ... 其他列配置代码 placesColumn.setOnEditCommit(event -> { // 记录最后编辑的项 lastEditedItem = event.getRowValue(); // 同步新值到模型(如果用方案2的话) int newPlaces = event.getNewValue(); lastEditedItem.setReservedPlaces(newPlaces); }); } // 比如在按钮点击或其他需要的地方获取最后编辑的项 public void printLastEditedItem() { if (lastEditedItem != null) { System.out.println("最后编辑的预订项:" + lastEditedItem.getReservedPlaces()); } else { System.out.println("还没有编辑过任何项"); } } }
最后排查点
如果还是没解决,检查这两个地方:
- 你是不是在编辑提交之前就调用了
getItems()?比如用户刚改完值但还没按回车,这时候界面显示的是临时值,模型还是旧的,必须等提交完成后再获取数据。 - 确认你的TableView的
editable属性已经设为true(tableView.setEditable(true);),不然列的editable设置了也没用。
内容的提问来源于stack exchange,提问作者Vincent Klein
相关产品推荐
相关产品推荐

