Javafx 2 JavaFX TextFieldTableCell-TableView更新问题

Javafx 2 JavaFX TextFieldTableCell-TableView更新问题,javafx-2,tableview,Javafx 2,Tableview,我正在使用Java8的TextFieldTableCell类使TableColumn可编辑 当单击表上的某个特定单元格时,该单元格将成为“TextField”,我可以编辑该文本。编辑完成时,即按下回车键时 col6.setOnEditCommit(new EventHandler<TableColumn.CellEditEvent<User, String>>() { @Override public void handle(CellEditEvent&

我正在使用Java8的
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 ");
        }
    }
});
在catch块中,但这没有任何区别,因为表仍然保存着
oldValue


如前所述,当异常发生时,如何将
TextfieldTableCell
的值还原为
TableCell
的值?

尝试在editCommit本身而不是OnEditCommit事件处理程序上捕获异常。在myEditableTableCell中,尝试

@Override
public void commitEdit(String val) {
    try {
        super.commitEdit(val);
    } catch (Exception e) {
        log.error("Failed: ", e);
        cancelEdit();
    }
}

感谢您的回复,我在想办法从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; 
    }
});
col6.setCellFactory(新回调(){
@凌驾
公共TableCell调用(TableColumn参数){
TextFieldTableCellmyEditableTableCell=新的TextFieldTableCell(新的DefaultStringConverter()){
@凌驾
public void committedit(字符串val){
int index=this.getTableRow().getIndex();
User newUser=this.getTableView().getItems().get(索引);
StringProperty oldval=newUser.fullNameProperty();
试一试{
setfullNameProperty(新的SimpleStringProperty(val));
更新用户(newUser);
调试(“视图更新为数据库更新”);
超级承诺(val);
}捕获(SQLE异常){
取消编辑();
newUser.setfullNameProperty(oldval);
日志错误(“用户更新失败”);
}
}
};
返回髓鞘表细胞;
}
});
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; 
    }
});