Хорошо, что вы знаете, что манипулирование компонентом Swing должно выполняться в потоке диспетчеризации событий, но простой ответ - нет , вы никогда не захотите запускать долгосрочную задачу или ждать блокировок, находясь EDT. EDT всегда должен оставаться очень отзывчивым. Кроме того, кроме этого, invokeAndWait()
не может быть вызвано из EDT по очевидным причинам.
Взгляните на эту старую статью о Threads и Swing - основные принципы все еще применяются.
Вам доступно несколько вариантов. Вы можете просто создать новый Thread
, Runnable
или FutureTask
для запуска на Executor
и вызывать invokeAndWait()
только когда это необходимо для обновления компонентов (но если вам это удастся, invokeLater()
лучше). Вы также можете использовать SwingWorker
(также в статье), который предоставляет дополнительные полезные способы взаимодействия между вашим потоком и EDT с надлежащей степенью разделения.