Я не совсем уверен, что понимаю вас, но мне все равно есть что добавить -
Убедитесь, что каждый раз, когда вы касаетесь GUI, он находится в потоке AWT. Теоретически это означает даже создание графического интерфейса пользователя (хотя на практике редко возникает проблема с созданием графического интерфейса пользователя в потоке, передаваемом вашему основному или другому потоку, но Sun в один момент обнаружила проблему и предложила против нее)
В любом случае, это означает, что вы используете invokeLater каждый раз, когда хотите обновить графический интерфейс из другого потока. Период.
(Обратите внимание, что всякий раз, когда GUI вызывает вас через обратный вызов (ActionListener и т. Д.), Он всегда будет потоком AWT, поэтому вы можете делать все что угодно с GUI в рамках обратных вызовов.
С вашим исправленным сообщением я могу предположить, что, если у вас есть шанс конфликта потоков и все равно выполняете ввод / вывод в графическом интерфейсе, одним из способов справиться с этим будет выполнение всех ваших "спорных" вещей в invokeLater. 1009 *
Хотя в большинстве случаев допустимо создавать GUI в вашем основном потоке (все, вплоть до setVisible (true) - теоретически), если есть вероятность конфликта из другого потока, invokeLater позаботится обо всем этом. очень детерминированный способ.