Lo del método repaint() no queda más remedio. Lo que puedes hacer es dibujar aparte, me explico.
En el método paint() crea un BufferedImage del mismo tamaño que el Canvas (pide getWidth() y getHeight() al Canvas para determinar ese tamaño). Dibuja sobre el BufferedImage, pidiéndole el getGraphics() y usando eso para pintar. Una vez que tengas todos los nodos dibujados en el BufferedImage, pinta ese BufferedImage completo sobre el Canvas. No hagas un borrado previo del Canvas, ya que eso aumenta el parpadeo.
En resumen, el código se parecería a esto
Código java:
Ver original imagen.getGraphics().draw....
....
g.drawImage(imagen, 0, 0, ....);
}
Aquí tienes algo más detallado
http://chuwiki.chuidiang.org/index.p...l_doble_buffer
Se bueno.