Подтвердить что ты не робот

Неблокирующий модальный диалог прогресса Swing

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

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

Но если я делаю процесс в рабочем потоке, конечный пользователь может нажимать кнопки и заставлять EDT манипулировать состоянием, в котором рабочий одновременно манипулирует, в результате чего возникают плохие вещи. Если я сделаю диалог модальным, этого не произойдет, но модальный в Swing также подразумевает блокировку, поэтому в момент, когда я вызываю setVisible(true), поток блокируется навсегда.

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

Итак, как мне получить диалог, который запрещает пользователю взаимодействовать с остальной частью системы (модальный), но не блокирует поток, который заставляет его быть видимым?

4b9b3361

Ответ 1

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

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

Ссылки: -

Ответ 2

Вы должны делать что-то неправильно. Попробуйте учебник по Как использовать Progress Bars. Если вы можете понять, как работает этот код, он должен дать вам направление для достижения требуемой функции.

Обратите внимание, что индикаторы выполнения обычно являются модальными.