Normale ... perché tutta la gestione della interfaccia utente cioè disegno dei componenti Swing, notifica degli eventi ai listener e altro è fatta in un unico singolo thread chiamato convenzionalmente Event Dispatch Thread. Se tieni tu "impegnato" il EDT in un ciclo o in un Thread.sleep() o altre computazioni pesanti, è chiaro che il framework in quel frangente di tempo non può proseguire con altre operazioni (disegni, eventi, ecc..).
Le soluzioni sono diverse: se devi fare qualcosa di "temporizzato" ogni tot di tempo e che fa cose brevi/veloci e magari operando sulla interfaccia utente, allora può bastare un timer, intendo javax.swing.Timer .
Se devi fare cose più lunghe, computazioni pesanti o cose del genere, allora è meglio creare un nuovo thread. Con tutto quello che comporta, cioè devi avere chiaro come definire/avviare il thread, come gestire in modo "cooperativo" la terminazione del tuo thread, come rendere "visibili" le modifiche tra il tuo thread e il EDT, ecc...