Swing - это единственная структура потока. То есть, существует один поток, ответственный за отправку всех событий всем компонентам, включая запросы на перерисовку.
Любое действие, которое останавливает / блокирует этот поток, приведет к зависанию вашего пользовательского интерфейса.
Первое правило Swing, НИКОГДА не запускать какие-либо блокирующие или трудоемкие задачи в Event Dispatching Thread, вместо этого вы должны использовать фоновый поток.
Это запустит вас во второе правило Swing , Никогда не создавать, изменять и не взаимодействовать с каким-либо компонентом пользовательского интерфейса вне EDT.
Существует несколько способов исправить это. Вы можете использовать SwingUtilities.invokeLater
или SwingWorker
.
SwingWorker
, как правило, проще, поскольку он предоставляет ряд простых в использовании методов, которые автоматически пересинхронизируют вызовы к EDT.
Прочитать Параллельность в Swing
Обновлено
Просто так вы понимаете;)
Ваш MainLoop
метод не должен выполняться в контексте EDT, это очень плохо.
Кроме того, вы не должны взаимодействовать с каким-либо компонентом пользовательского интерфейса от любого другого потока, кроме EDT.