1) Является ли иногда допустимым делать все эти вызовы извне потока Swing?
Есть несколько исключений (установка текстового значения текстового поля, например, делает автоматическое проксирование EDT для вас) - но есть нет ситуаций, когда это лучше сделать. Если вы выполняете много обновлений, вы можете сделать их все за один вызов EDT (один вызов invokeLater ()) вместо отдельных вызовов, но даже такого рода пакетирование очень редко помогает. Длинный и короткий: выполняйте операции над компонентами Swing из EDT. Это включает в себя чтение и запись.
2) Какое влияние оказывает на поток Swing и почему пользовательский интерфейс менее отзывчив, когда я вызываю его извне?
Ну, EDT отвечает за обновление графического интерфейса. Если вы звоните извне, это не «менее отзывчиво» - фактические системные вызовы низкого уровня, которые обновляют пользовательский интерфейс, не происходят (вообще). Вероятно, в вашем приложении происходит то, что первоначальным разработчикам повезло и они меняют состояние компонента Swing, не создавая действительно неприятных условий гонки. Затем какое-то другое событие вызывает перерисовку в EDT, что приводит к обновлению компонента. Это может показаться «недостаточной отзывчивостью», но в действительности происходит «отсутствие обновления экрана».
EDT - это обычный поток, но он немного особенный, поскольку он работает в узком цикле, который обрабатывает сигналы, связанные с графическим интерфейсом (например, команды рисования). Семантеки размещения команд этих типов в EDT действительно очень отличаются от того, что мы обычно называем потоками Java (оно включает в себя отправку операций в насос сообщений).
Длинно и коротко - все те Javadoc, которые говорят «взаимодействуют только с объектами Swing в EDT», написаны по причине. Не связывайтесь с этим. Если вы хотите выполнить фоновую обработку, хорошо - но вы несете ответственность за передачу взаимодействия с компонентами J * обратно в EDT (чаще всего с использованием invokeLater ()).