2015-04-08 3 views
1

У меня есть таблица, написанная в JavaFX, что пользователь имеет возможность редактировать один из своих столбцов. Когда происходит редактирование ячейки, я пытаюсь переименовать некоторый внутренний объект на основе нового текста. Если это переименование не удалось, я выдаю уведомление + всплывающее диалоговое окно с ошибкой, а затем я хотел бы восстановить исходный текст в этом поле. По какой-то причине это приводит меня в бесконечный цикл всплывающих окон.Как восстановить предыдущее значение в JavaFX TableColumn's onEditCommit?

Код я в настоящее время от оригинального писателя выглядит следующим образом:

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

Попробуйте использовать

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

Последние 2 линии Oldy обходные пути для регенерирования Tableview визуализации значений.

EDIT:

Если скопированная модель данных (пункт поле Tableview) не изменяются, если исключение, то просто обновить 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); 
     } 
+0

Самого переименованием не удалось, поэтому вызов переименования снова является избыточным. Все, что мне нужно, это интерфейс (таблица), чтобы вернуться к старому значению. Моя проблема возникает только при включении всплывающего окна, так или иначе это вызывает событие снова и снова, и я не могу его остановить. –

+0

Итак, я думаю, что я хочу, чтобы как-то вызвать событие отмены отмены и/или заставить ячейку вернуть прежнее значение. –

+0

@OrenSarid см. Обновление. Я ничего не могу сказать о вашем всплывающем окне, так как информации об этом нет. –