简体   繁体   English

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

[英]How do I restore a previous value in JavaFX TableColumn's onEditCommit?

I have a table written in JavaFX, that the user has the option to edit one of its columns.我有一个用 JavaFX 编写的表,用户可以选择编辑其中一个列。 When an editing of a cell takes place, I try to rename some internal object based on the new text.当对单元格进行编辑时,我尝试根据新文本重命名一些内部对象。 If that renaming fails, I issue a notification + popup an error dialog, and then I'd like to restore the original text into that field.如果重命名失败,我会发出通知+弹出错误对话框,然后我想将原始文本恢复到该字段中。 For some reason, this gets me into an infinite loop of error popups.出于某种原因,这让我陷入了错误弹出的无限循环。

The code I currently have from the original writer is as follows:我目前从原作者那里得到的代码如下:

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...
            }
        }
    });

Try to use 尝试使用

TableColumn.CellEditEvent.getOldValue()

For example: 例如:

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

The last 2 lines are oldy workarounds for refreshing tableview rendered values. 最后两行是用于刷新tableview呈现值的旧方法。

EDIT: 编辑:

If the backed data model (item fields of tableview) is not changed when the exception is thrown then just update tableview rendering in catch block with: 如果抛出异常时未更改支持的数据模型(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);
        }

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM