Диалог ошибок не уничтожается - PullRequest
2 голосов
/ 05 января 2009

Я работаю над проектом, использующим JTable для отображения, помимо прочего, столбца дат. Мы нуждались в проверке для ввода данных пользователем для дат, поэтому я реализовал комбинацию маскирования для проверки формата и анализа для проверки фактической даты. Я сделал это, используя пользовательский CellEditor для столбца даты.

Внутри моего MaskedCellEditor у меня есть JFormattedTextField. Я устанавливаю маскировку для дат. Затем я добавляю InputVerifier для фактической проверки. Мой InputVerifier реализует verify () для проверки: 1. textField.isEditValid () 2. DateValidator.ValidDate (). Если какой-либо из них недействителен, вернитесь и верните false, а InputVerifier заблокирует фокус в текстовом поле (редактор ячеек) и отобразится небольшое диалоговое окно с напоминанием пользователю о формате даты.

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

Если пользователь выбирает кнопку меню в верхней части приложения, когда в диалоговом окне появляется неверное редактирование, он переключает экраны, уничтожая все, что в данный момент находится на экране (включая таблицу). Однако, поскольку диалоговое окно отображается, а нажатие / успешное редактирование не происходит, диалоговое окно никогда не скрывается. Он остается видимым в совершенно не связанном контексте на другом экране. После того как пользователь выключил экран с таблицей, пользователь не может избавиться от диалогового окна.

Я обсуждал вопрос о том, добавляю ли Timer и / или MouseListener в само диалоговое окно, что может привести к его исчезновению, но я чувствую, что игнорирую реальную проблему. Диалоговое окно никогда не удаляется, и я уверен, что оно есть, потому что оно все еще установлено, чтобы быть видимым и мешает сборщику мусора избавиться от него.

У меня есть метод Cleanup на панели, содержащей JTable, но я не могу найти хороший способ ссылки на диалог (компонент InputVerifier), чтобы избавиться от него. Диалог довольно далеко от родительской панели таблицы. (Панель -> JTable -> CellEditor -> JFormattedTextField -> InputVerifier -> JDialog)

Любые идеи о том, как заставить диалог быть скрытым при разрушении таблицы? Если вам нужно больше деталей, дайте мне знать. Я стараюсь, чтобы вы не увязли в деталях, но многое происходит.

Ответы [ 2 ]

1 голос
/ 06 января 2009

Как первая мысль, разве вы не можете отказаться от подхода слушателя. Если у вас есть метод типа closeErrorDialog (), который вызывается при успешном проверке, вы также можете вызывать его при выборе действия меню.

В качестве альтернативы, возможно, вы могли бы каким-то образом управлять переходом из меню в меню и создать метод «очистки», который закроет все существующие диалоговые окна с сообщениями об ошибках. Это позволило бы выполнять любые другие действия, которые должны происходить при смене меню, в том же месте.

Просто пара быстрых идей о макушке моей головы. Надеюсь, они соответствуют тому, что вы имели в виду

0 голосов
/ 05 января 2009

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...