вам нужно использовать SwingWorker
. Способ работы Swing заключается в том, что он имеет один основной поток - поток диспетчеризации событий (EDT), который управляет пользовательским интерфейсом.В документации по Swing вы увидите, что рекомендуется никогда не выполнять долго выполняющиеся задачи в EDT, поскольку, поскольку он управляет пользовательским интерфейсом, если вы делаете что-то сложное в вычислительном отношении, ваш пользовательский интерфейс будет зависать.Это именно то, что вы делаете.
Так что вам нужно, чтобы ваша кнопка вызывала SwingWorker, чтобы сложные вещи выполнялись в другом потоке.Будьте осторожны, чтобы не изменять элементы пользовательского интерфейса из SwingWorker;весь код пользовательского интерфейса должен быть выполнен в EDT.
Если щелкнуть ссылку для SwingWorker, вы увидите следующее:
На событии не должны выполняться трудоемкие задачиОтправка темы.В противном случае приложение перестает отвечать на запросы.Доступ к компонентам Swing возможен только в потоке диспетчеризации событий
, а также ссылки на примеры использования SwingWorker.