JavaFX TextFieldTableCell - TableView更新问题

时间:2014-05-05 16:20:54

标签: javafx-2 tableview

我正在使用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的值?

2 个答案:

答案 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; 
    }
});