如何在JavaFX TableColumn的onEditCommit中恢复以前的值?

时间:2015-04-08 10:28:57

标签: java javafx tablecolumn

我有一个用JavaFX编写的表,用户可以选择编辑其中一个列。当编辑单元格时,我尝试根据新文本重命名一些内部对象。如果重命名失败,我会发出通知+弹出一个错误对话框,然后我想将原始文本恢复到该字段中。出于某种原因,这会让我陷入无限循环的错误弹出窗口。

我原来作家的代码如下:

mNameColumn.setOnEditCommit(
    new EventHandler<TableColumn.CellEditEvent<StateDefinition, String>>() {
        @Override
        public void handle(TableColumn.CellEditEvent<StateDefinition, String> event) {
            try {
                someObject.rename(((StateDefinition) event.getTableView().getItems().get(event.getTablePosition().getRow())).getState(), event.getNewValue());
            } catch (MYException ex) {
                MyNotificationCollector.addNotification("Failed renaming: " + ex.getLocalizedMessage(), NotificationType.SYSTEM_WARNING);
                //popup error message code here
                // Need to revert the cell's text to the previous value here...
            }
        }
    });

知道我做错了什么吗?如何在不再调用单元格编辑提交事件的情况下恢复旧值?

谢谢, 奥伦

1 个答案:

答案 0 :(得分:2)

尝试使用

TableColumn.CellEditEvent.getOldValue()

例如:

        try {
            someObject.rename(((StateDefinition) event.getTableView().getItems()
               .get(event.getTablePosition().getRow())).getState(), 
                   event.getNewValue());

        } catch (MYException ex) {
            MyNotificationCollector.addNotification("Failed renaming: " 
                + ex.getLocalizedMessage(), NotificationType.SYSTEM_WARNING);

            // popup error message code here
            // Revert the cell's text to the previous value here...

           someObject.rename(((StateDefinition) event.getTableView().getItems()
                .get(event.getTablePosition().getRow())).getState(),
                   event.getOldValue());

            // workaround for refreshing rendered view
            event.getTableView().getColumns().get(0).setVisible(false);
            event.getTableView().getColumns().get(0).setVisible(true);
        }

最后两行是用于刷新tableview呈现值的旧解决方法。

修改

如果在抛出异常时未更改支持的数据模型(tableview的项目字段),则只需使用以下命令更新catch块中的tableview呈现:

} catch (MYException ex) {
            MyNotificationCollector.addNotification("Failed renaming: " 
                + ex.getLocalizedMessage(), NotificationType.SYSTEM_WARNING);

            // workaround for refreshing rendered view
            event.getTableView().getColumns().get(0).setVisible(false);
            event.getTableView().getColumns().get(0).setVisible(true);
        }