Se non erro, il problema è che l'evento viene gestito dallo stesso Thread di Swing che si occupa di fare il repaint. Quindi anche se tu chiedi di fare il repaint, Swing non può ridisegnare l'oggetto perché...è già impegnato a gestire il tuo evento

Dovresti fare in modo che la tua elaborazione con il while avvenga in un Thread diverso, in modo che il thread Swing sia libero di fare repaint ogni volta che glielo chiedi.