Когда вы делаете что-то в функции обратного вызова кнопки, вы по сути останавливаете поток рисования графического интерфейса - не только для кнопки, но и для ЛЮБОГО рисования графического интерфейса. (Попробуйте закрыть интерфейс другим окном, а затем снова открыть его - он не будет перекрашиваться, пока задача не будет завершена!)
Что вам нужно сделать, это создать поток, чтобы выполнить долгосрочную задачу, а затем заставить этот поток использовать SwingUtilities.invokeLater (), чтобы включить кнопку. invokeLater вызывает включение кнопки в потоке рисования графического интерфейса.
Возможно, вы захотите установить занятый курсор или иным образом заблокировать интерфейс во время работы длинного потока.