Вам понадобится многопоточность. Если бы я, где вы, я бы отделил код GUI и код сервера, а при нажатии кнопки я просто запустил код сервера как новый поток.
Ваш код замораживает графический интерфейс в основном потому, что все события выполняются в потоке Dispatcher потока (EDT), который является потоком, который заботится обо всех ваших файлах GUI и соответствующих событиях. Если вы либо заблокируете его, остановите его или выбросите в циклы, это повлияет на его производительность.