Отложить очередь событий после потери фокуса - PullRequest
2 голосов
/ 14 февраля 2012

У меня есть JTable с пользовательским редактором ячеек. В редакторе реализован FocusListener, поэтому я могу проверить, является ли содержимое ячейки действительным, если пользователь уходит от ячейки.

Я хотел бы использовать JOptionPane в focusLostEventDispatchThread), чтобы позволить пользователю выбрать, следует ли вернуться к старому значению или принять скорректированное значение.

Вот проблема; если пользователь редактирует ячейку, а затем нажимает кнопку вне таблицы, кнопки actionlisteners получают уведомление до того, как JOptionPane вернется.

Я бы хотел, чтобы это произошло:

  • Пользователь редактирует ячейку
  • Пользователь нажимает кнопку
  • Ячейка обнаруживает потерю фокуса
  • JOptionPane отображается и пользователь выбирает действие
  • JOptionPane закрывается и значение ячейки устанавливается
  • Кнопка actionListeners под названием

Вместо этого это происходит:

  • Пользователь редактирует ячейку
  • Пользователь нажимает кнопку
  • Ячейка обнаруживает потерю фокуса
  • Отображается JOptionPane, и пользователь выбирает действие
  • Кнопка ActionListeners называется
  • JOptionPane закрывается и значение ячейки устанавливается

Можно ли отложить события действия кнопки до закрытия JOptionPane?

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

Ответы [ 2 ]

0 голосов
/ 14 февраля 2012

Поместите вашу логику проверки в TableCellEditor#stopCellEditing(), показывая ваш диалог и возвращая false, если значение недопустимо.

Чтобы автоматически остановить редактирование таблицы при потере фокуса, используйте table.putClientProperty("terminateEditOnFocusLost", true);, но я не думаю, что это остановит работу слушателя кнопок. Вместо этого я обычно прекращаю редактирование таблицы в actionPerformed и ничего не делаю, когда возвращается false (или отменяю редактирование, когда это необходимо, например, если действие заключается в удалении этой строки таблицы).

0 голосов
/ 14 февраля 2012

Из того, что я понял, вы не хотите, чтобы слушатель действия кнопки вообще активировался, пока ПОСЛЕ того, как пользователь не выберет правильное значение из панели JOptionPane.

Мне кажется, что решение будетустановить флаг «отключен», который повышается после срабатывания focusLost.После того, как выбор сделан, флаг отключения отключается.Когда срабатывает кнопка, она проверяет, не заблокирована ли форма;если это так, он ничего не делает.Если это не так, то все продолжается как обычно.

Обратите внимание, что событие кнопки не будет происходить автоматически, как только пользователь выберет что-то в панели JOptionPane, но вместо этого ему придется снова нажать кнопку.Мне это кажется более функциональным, чем повторное нажатие кнопки после того, как ему потребуется изменить форму.

...