Kör du med double buffering? För att få mjuka animationer brukade man åtminstone förr i tiden köra något i stil med:
(0. Buffer B1 visas)
1. Rita all grafik som ska visas till buffer B2. Detta får ta den tid det tar;
2. När allting är färdigt, kopiera B2 till B1
3. Upprepa från 1.
Exempelvis skulle din paintComponent-metod kunna ha en enda uppgift; att rita ut buffer B1 (g.drawImage(0, 0, bufferOne);)
Sedan har du en swap som "målar över" B1 med B2. Buffrarna kan t ex vara BufferedImage eller VolatileImage i standardbiblioteket.