Hola:
No he mirado mucho el código, simplemente un detalle. La clase javax.swing.Timer no es precisa, a veces puede tardar más, a veces menos, dependiendo de la carga de tu código y de los eventos de teclado/ratón/repintado que queden encolados, ya que ese Timer avisa en el mismo hilo de todos esos eventos. Y el código que hagas dentro de ese ActionListener del Timer también afecta a su vez al pintado, ya que puede ralentizar ese hilo. Te pego de la API http://docs.oracle.com/javase/6/docs/api/javax/swing/Timer.html
Como prueba rápida, usa java.util.Timer, que va totalmente separado del hilo de pintado y de los eventos de teclado y ratón, aparte de usar el reloj del sistema y ser más preciso que javax.swing.timer.
Se bueno.
No he mirado mucho el código, simplemente un detalle. La clase javax.swing.Timer no es precisa, a veces puede tardar más, a veces menos, dependiendo de la carga de tu código y de los eventos de teclado/ratón/repintado que queden encolados, ya que ese Timer avisa en el mismo hilo de todos esos eventos. Y el código que hagas dentro de ese ActionListener del Timer también afecta a su vez al pintado, ya que puede ralentizar ese hilo. Te pego de la API http://docs.oracle.com/javase/6/docs/api/javax/swing/Timer.html
Citarthe action event handlers for Timers execute on another thread -- the event-dispatching thread. This means that the action handlers for Timers can safely perform operations on Swing components. However, it also means that the handlers must execute quickly to keep the GUI responsive.
Como prueba rápida, usa java.util.Timer, que va totalmente separado del hilo de pintado y de los eventos de teclado y ratón, aparte de usar el reloj del sistema y ser más preciso que javax.swing.timer.
Se bueno.