我正在使用Java 8的TextFieldTableCell
课程来编辑TableColumn
。
当点击表格上的特定单元格时,单元格变为“TextField”,我可以编辑文本。编辑完成后,如果按下回车键
col6.setOnEditCommit(new EventHandler<TableColumn.CellEditEvent<User, String>>() {
@Override
public void handle(CellEditEvent<User, String> event) {
User newUser = event.getRowValue();
log.debug("Data Changed in the column need to call DB >>new" +event.getNewValue() + "old --> " + event.getOldValue());
try {
um.updateUser(newUser);
log.debug("View updated as DB updated");
} catch (Exception e) {
log.error("User update failed ");
}
}
});
调用setOnEditCommit
方法。这可以按预期工作。
然而,当updateUser()
失败时,它会抛出异常。发生这种情况时,我希望将表的CellValue
恢复为之前的值。
问题是UI继续显示最近输入的值(即使基础对象仍然保留旧值)。
为了让UI恢复到旧的值,即Bean中的值,我必须对表列进行排序或执行一些操作,以便刷新视图。
我试过了我的:
myEditableTableCell.updateTableColumn(col6);
在catch块中但由于表仍然保持oldValue
而没有任何区别。
如果出现异常,如何将TextfieldTableCell
的值恢复为TableCell
的值?
答案 0 :(得分:2)
尝试在editCommit本身而不是OnEditCommit事件处理程序上捕获异常。在myEditableTableCell中,尝试
@Override
public void commitEdit(String val) {
try {
super.commitEdit(val);
} catch (Exception e) {
log.error("Failed: ", e);
cancelEdit();
}
}
答案 1 :(得分:0)
感谢您的回复,我无法找到从我的UI类调用cancelEdit
方法的方法。终于设法做到了。以下是工作代码段:
col6.setCellFactory(new Callback<TableColumn<User, String>, TableCell<User, String>>() {
@Override
public TableCell<User, String> call(TableColumn<User, String> param) {
TextFieldTableCell<User, String>myEditableTableCell = new TextFieldTableCell<User, String>(new DefaultStringConverter()) {
@Override
public void commitEdit(String val) {
int index = this.getTableRow().getIndex();
User newUser = this.getTableView().getItems().get(index);
StringProperty oldval = newUser.fullNameProperty();
try {
newUser.setfullNameProperty(new SimpleStringProperty(val));
um.updateUser(newUser);
log.debug("View updated as DB updated");
super.commitEdit(val);
} catch (SQLException e) {
cancelEdit();
newUser.setfullNameProperty(oldval);
log.error("User update failed ");
}
}
};
return myEditableTableCell;
}
});