Неблокирующее модальное диалоговое окно Swing

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

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

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

Таким образом, мое текущее «решение» состоит в том, чтобы использовать рабочий поток, а затем порождать отдельный поток, единственной целью которого является поглощение блокирующей природыsetVisible, Конечно, должно быть лучшее решение!

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

 Zarkonnen20 окт. 2012 г., 09:39
Смотрите также:stackoverflow.com/questions/3954120/...

Ответы на вопрос(2)

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

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

 Zarkonnen14 окт. 2010 г., 22:21
Сделали так. Но если вы запустите демонстрацию, вы все равно сможете манипулировать главным окном, пока отображается индикатор прогресса. Если я сделаю замену для монитора прогресса, он перестанет работать, так как EDT снова застрял в ожидании возврата setVisible.
 Zarkonnen10 окт. 2010 г., 20:05
Код в учебнике не создает модальные индикаторы выполнения / диалоги. Я все еще могу манипулировать GUI, пока процесс выполняется в SwingWorker.
 Andrew Thompson11 окт. 2010 г., 03:35
@Zarkonnen Полагаю, вы ссылаетесь на демоверсии ProgressMonitor. Попробуйте вместо этого JProgressBar в модальном диалоге.
Решение Вопроса

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

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

Ссылки: -

Официальный учебник по GlassPaneНекоторые полезные урокиЕще один тутКачели Ореилли отлично.

Ваш ответ на вопрос