Диалог ошибки не удаляется

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

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

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

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

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

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

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

Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
Как вычислять биты и понимать побитовые операторы в Java - объяснение с примерами
Как вычислять биты и понимать побитовые операторы в Java - объяснение с примерами
В компьютерном программировании биты играют важнейшую роль в представлении и манипулировании данными на двоичном уровне. Побитовые операции...
Поднятие тревоги для долго выполняющихся методов в Spring Boot
Поднятие тревоги для долго выполняющихся методов в Spring Boot
Приходилось ли вам сталкиваться с требованиями, в которых вас могли попросить поднять тревогу или выдать ошибку, когда метод Java занимает больше...
Полный курс Java для разработчиков веб-сайтов и приложений
Полный курс Java для разработчиков веб-сайтов и приложений
Получите сертификат Java Web и Application Developer, используя наш курс.
2
0
388
2
Перейти к ответу Данный вопрос помечен как решенный

Ответы 2

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

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

Saterus 06.01.2009 00:16

Затем вам понадобится какая-то ловушка, чтобы код меню мог отменить отображение объекта перед переключением с этого экрана.

Paul Tomblin 06.01.2009 20:30
Ответ принят как подходящий

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

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

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

Другие вопросы по теме