Это явно какое-то состояние гонки.Я не думаю, что это так просто, как ответ Эрика Робертсона.Код show()
в диалоге довольно сложный, он содержит некоторую специальную логику для вызова из потока диспетчеризации событий, а также отправляет события в очередь событий.Возможно, порядок, в котором публикуются события, каким-то образом зависит от задержек потоков.
Возможно, вам нужно SwingUtilities.invokeAndWait()
, таким образом вы гарантируете, что setVisible(true)
завершил выполнение до вызова setVisible(false)
.. Как указал Skip Head, invokeAndWait будет блокироваться до тех пор, пока диалог не будет закрыт.
И зачем он вам нужен?
РЕДАКТИРОВАТЬ: Это мой сценарий того, что происходит:
- Вы вызываете d.show (), который отправляет
setVisible(true)
событие - , поток помещается в спящий режим планировщиком, и EDT запускает и начинает выполнение первого события
- EDT удаляется до завершения первой задачи и публикует фактическое событие, отображающее диалоговое окно
- , когда ваш поток выполняет d.hide (), который отправляет событие setVisible (false).Поток завершен, и EDT запускает
- EDT завершил первое задание, помещает свое событие показа в очередь событий
- Он переходит к следующему событию, и, вуаля, это setVisible (false) event!
- Он портит все состояние диалога и остается видимым и не отвечает.
EDIT2: похоже, ProgressMonitor обладает функциональностью, которую выпытаемся реализовать.