Я немного устал от того, что люди говорят так или иначе, но на самом деле не знают, о чем говорят. Я пришел сюда, задаваясь вопросом, какой поток JOptionPane должен быть запущен, но я получаю противоречивые ответы без каких-либо реальных доказательств в поддержку какой-либо из этих точек. Ну, я исследовал это сам, и я очень доволен этим ответом, поэтому я поделюсь.
Вызов одного из showXXXDialog () из JOptionPane является BLOCKING, пока пользователь не выберет ok / cancel / etc. Как правило, такие медленные блокирующие потоки не помещаются в поток диспетчеризации событий (EDT), как правило, потому что все остальные компоненты графического интерфейса будут зависать. Таким образом, инстинктивный инстинкт не помещать это в EDT хорош, но это также неправильно. Причина в том, что, как утверждают некоторые другие, метод создает компоненты GUI, и это всегда должно быть сделано в EDT. Но как насчет блокировки? Вы заметите, что даже если вы запустите его на EDT, он работает нормально. Причина находится внутри исходного кода. Класс JOptionPane создает объект Dialog, а затем вызывает show (), а затем dispose (), первым из которых является то, что блокирует поток. Если вы прочтете комментарии (или javadoc), вы увидите, что это говорит о методе:
Если диалоговое окно является модальным и не отображается, этот вызов не будет
возвращайтесь, пока диалог не будет скрыт, вызывая hide или dispose. это
допускается показ модальных диалогов из потока диспетчеризации событий
потому что инструментарий будет гарантировать, что еще один насос событий работает в то время как
тот, который вызвал этот метод, заблокирован.
Итак, совершенно безопасно запускать JOptionPane на EDT, несмотря на его блокировку. Очевидно, что безопасно вызывать метод Dialog show () из EDT, но то же самое нельзя сказать о JOptionPane, потому что его методы создают компоненты GUI, добавляют слушатели, обращаются к другим контейнерам при модальном и блокируют ввод данных и т. Д. Вы не делаете этого. Я хочу, чтобы все это было сделано вне EDT, потому что оно не поточно-ориентированное и могут возникнуть проблемы. Правда, я никогда не видел проблем при использовании JOptionPane вне EDT, и поэтому шансы кажутся низкими, но они, безусловно, возможны. Передача null для контейнера диалога и предоставление только неизменяемых объектов (таких как Strings) в качестве аргументов для полей значительно уменьшит (возможно, даже устранит, насколько я знаю) вероятность чего-то плохого, потому что все соответствующие компоненты GUI сделаны и доступны в той же теме, пока они не видны. Но вы должны просто быть в безопасности и поставить его на EDT. Нетрудно вызвать SwingUtilities.invokeAndWait ().