Я работаю над проектом, использующим 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)
Любые идеи о том, как заставить диалог быть скрытым при разрушении таблицы? Если вам нужно больше деталей, дайте мне знать. Я стараюсь, чтобы вы не увязли в деталях, но многое происходит.