Вопрос

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

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

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

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

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

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

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

Это было полезно?

Решение

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

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

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

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

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

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top