2015-08-07 2 views
0

КонтекстNatTable IColumnAccessor.setDataValue вызывается дважды

я реализовал NatTable (v1.1.0.201405012245) - пожалуйста, рассмотрите этот упрощенный пример:

Конечно, это не реальный код, но моя проблема также может быть продемонстрирована с помощью этого кода.

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

Чтобы показать свою основную проблему, в приведенном здесь коде я проверяю простое условие в IColumnAccessor#setDataValue (вход содержит «x») и соответственно показывает ошибку.

Проблема

Моя актуальная проблема в том, что если вы вводите й в TextCellEditor, диалоговое окно ошибки появляется дважды (в последовательности - это означает, что, как только для первой, второй я нажимаю КИ один покажет).

Анализ

Мой анализ показывает, что причина в том, что setDataValue вызывается дважды:

  1. , поскольку ключ ENTER нажата - StackTrace

    • TextCellEditor(AbstractCellEditor).commit(SelectionLayer$MoveDirectionEnum, boolean) line: 331
    • TextCellEditor(AbstractCellEditor).commit(SelectionLayer$MoveDirectionEnum) line: 326
    • TextCellEditor$1.keyPressed(KeyEvent) line: 246
  2. потому что TextCellEditor теряет фокус - StackTrace

    • TextCellEditor(AbstractCellEditor).commit(SelectionLayer$MoveDirectionEnum, boolean, boolean) line: 341
    • TextCellEditor(AbstractCellEditor).commit(SelectionLayer$MoveDirectionEnum, boolean) line: 331
    • AbstractCellEditor$InlineFocusListener.focusLost(FocusEvent) line: 462

Итак, мой главный вопрос: как я могу предотвратить (или, по крайней мере, обнаружить) второе событие?

+0

Не могли бы вы удалить или отменить регистрацию одного из слушателей, например. Прослушиватель KeyPress? – darijan

+0

@ darijan любые предложения как? Я вообще не регистрирую слушателей, все это происходит внутри NatTable API ... –

+0

Мне очень жаль, но нет. У меня большой опыт работы с swt.Tables и TextCellEditors, но не с этой библиотекой ... Это была просто идея. – darijan

ответ

1

Проблема с вашей реализацией заключается в том, что вы выполняете преобразование в IColumnAccessor и открываете диалоговое окно для информирования пользователя об ошибке. Но это не способ сделать это с NatTable из-за различных вариантов использования.

Если вам необходимо выполнить преобразование и/или проверку, вам необходимо зарегистрировать соответствующий IDisplayConverter и IDataValidator. Поскольку вам нужна String, вам не нужно регистрировать другой конвертер, поскольку этот конвертер по умолчанию, который зарегистрирован через DefaultEditConfiguration, делает это уже. Итак, вам нужен IDataValidator, который проверяет значение x и генерирует исключение ValidationFailedException.Если вы зарегистрируете DialogErrorHandling в качестве обработчика ошибок проверки, ошибка с сообщением об исключении будет показана в диалоговом окне. И проверки для того, чтобы не открывать диалог дважды, делается внутренне.

Это объясняется в настоящее время (небольшой) документации http://www.eclipse.org/nattable/documentation.php?page=editing

BTW, я предлагаю обновить до последней NatTable релиз 1.3.0, поскольку она также содержит несколько исправлений ошибок.

+0

Спасибо за подсказку и ссылку. Моя проблема заключается в том, что в моем случае бизнес-логика в модели реализована таким образом, что я знаю только, является ли коммит полностью согласованным, когда я действительно совершаю (который записывает в несколько файлов). И писать в файлы - это то, чего не следует делать в validatior ;-) Я согласен с тем, что в идеальной системе логика проверки и фиксации должна быть независимой, но в этом случае мы столкнулись с крупным рефакторингом. Может быть, есть второе лучшее решение? –

+0

Если я правильно понимаю, вам нужна какая-то «слабая проверка», потому что ваша модель может содержать «недопустимые» данные, пока все данные не будут согласованы. Это верно? В этом случае вам может потребоваться взглянуть на сообщение в блоге, которое я написал о перекрестной/слабой проверке в NatTable некоторое время назад. http://blog.vogella.com/2013/03/02/crossweak-validation-in-nattable-by-dirk-fauth/ –

 Смежные вопросы

  • Нет связанных вопросов^_^