Беспокойный вопрос, но я действительно не могу заставить это работать: у меня есть какой-то длительный процесс в приложении Swing, который может занять несколько минут. Я хочу отобразить диалог прогресса пользователю, пока этот процесс продолжается. Я также хочу, чтобы пользователь не выполнял дальнейшие действия, например, нажатие кнопки во время процесса.
Если я делаю процесс на EDT, это, очевидно, не позволяет конечному пользователю ничего делать, пока процесс продолжается. Но поскольку EDT занят обработкой, он никогда не обходится для отображения содержимого диалога, поэтому я просто получаю схему диалога.
Но если я делаю процесс в рабочем потоке, конечный пользователь может нажимать кнопки и заставлять EDT манипулировать состоянием, в котором рабочий одновременно манипулирует, в результате чего возникают плохие вещи. Если я сделаю диалог модальным, этого не произойдет, но модальный в Swing также подразумевает блокировку, поэтому в момент, когда я вызываю setVisible(true)
, поток блокируется навсегда.
Итак, мое текущее "решение" - использовать рабочий поток, а затем порождать отдельный поток, единственной целью которого является поглощение блокирующего характера setVisible
. Разумеется, должно быть лучшее решение!
Итак, как мне получить диалог, который запрещает пользователю взаимодействовать с остальной частью системы (модальный), но не блокирует поток, который заставляет его быть видимым?