Неблокирующее модальное диалоговое окно Swing - PullRequest
16 голосов
/ 08 октября 2010

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

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

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

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

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

Ответы [ 2 ]

15 голосов
/ 11 октября 2010

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

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

Ссылки: -

  1. Официальное руководство по GlassPane
  2. Некоторыеполезные учебные пособия
  3. Еще один рассказ
  4. Качели Орейли отлично.
0 голосов
/ 08 октября 2010

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

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

...