Диалог ошибок не уничтожается
Я работаю над проектом, использующим JTable для отображения, помимо прочего, столбца дат. Мы нуждались в проверке для ввода данных пользователем для дат, поэтому я реализовал комбинацию маскирования для проверки формата и анализа для проверки фактической даты. Я сделал это, используя пользовательский CellEditor для столбца даты.
Внутри моего MaskedCellEditor у меня есть JFormattedTextField. Я устанавливаю маскировку для дат. Затем я добавляю InputVerifier для фактической проверки. Мой InputVerifier реализует verify() для проверки: 1. textField.isEditValid() 2. DateValidator.ValidDate(). Если какой-либо из них недействителен, вернитесь и верните false, а InputVerifier заблокирует фокус в текстовом поле (редактор ячеек) и отобразится небольшое диалоговое окно с напоминанием пользователю о формате даты.
Сообщение об ошибке - это маленький, неокрашенный, немодальный, не фокусируемый JDialog, который появляется под редактируемой ячейкой. Он исчезает при нажатии клавиши или успешной проверке даты. Он отлично работает, за исключением небольшого края корпуса.
Если пользователь выбирает кнопку меню в верхней части приложения, когда в диалоговом окне появляется неверное редактирование, он переключает экраны, уничтожая все, что в данный момент находится на экране (включая таблицу). Однако, поскольку диалоговое окно отображается, а нажатие / успешное редактирование не происходит, диалоговое окно никогда не скрывается. Он остается видимым в совершенно не связанном контексте на другом экране. После того, как пользователь выключил экран с таблицей, пользователь не может избавиться от диалогового окна.
Я обсуждал вопрос о добавлении Timer и / или MouseListener в само диалоговое окно, которое могло бы привести к его исчезновению, но я чувствую, что игнорирую реальную проблему. Диалог никогда не удаляется, и я уверен, что он есть, потому что он все еще установлен, чтобы быть видимым, и это мешает сборщику мусора избавиться от него.
У меня есть метод очистки на панели, содержащей JTable, но я не могу найти хороший способ ссылки на диалог (компонент InputVerifier), чтобы избавиться от него. Диалог довольно далеко от родительской панели таблицы. (Панель -> JTable -> CellEditor -> JFormattedTextField -> InputVerifier -> JDialog)
Любые идеи о том, как заставить диалог быть скрытым, когда таблица уничтожена? Если вам нужно больше деталей, дайте мне знать. Я стараюсь, чтобы вы, ребята, не увязли в деталях, но многое происходит.
2 ответа
Как первая мысль, разве нельзя опускать подход слушателя. Если у вас есть метод типа closeErrorDialog(), который вызывается при успешном проверке, вы также можете вызвать его, когда выбрано действие меню.
В качестве альтернативы, возможно, вы могли бы каким-то образом управлять переходом от меню к меню и создать метод "очистки", который закроет все существующие диалоговые окна с сообщениями об ошибках. Это позволило бы выполнять любые другие действия, которые должны происходить при смене меню, в том же месте.
Просто пара быстрых идей о моей голове. Надеюсь, они соответствуют тому, что вы имели в виду
Многие проголосуют за то, что я сказал это, но похоже, что ваш диалог должен быть модальным, чтобы пользователи не могли отказаться от него, не отклонив его в первую очередь. Или, по крайней мере, отключите меню, которые позволяют людям переключаться, пока отображается этот диалог.