Generell läuft es so, dass dein Programm Event basiert ist. Daraus folgen gewisse Dinge:
- Du solltest im Thread, in dem Du auf Events reagierst, nichts machen, das diesen EDT (Event Dispatch Thread) blockiert.
- Die Applikation malt das Fenster (oder Teile davon) immer nur, wenn es dazu aufgefordert wird. Das ist auch ein normales Event wie z.B, ein Mausclick, nur eben wird der vom Programm selbst behandelt und du bekommst davon nichts mit, außer dass Du evtl. mitbekommst, dass eine von Dir überschriebene Methode (paint / paintComponent) aufgerufen wird.
Das nur kurz zur Grundlage, falls Dir die noch nicht bewusst war. Nun zur Problematik:
Du musst Dir merken, was alles gemalt wurde. Also brauchst Du eine Liste aller gemalten Kreise. Und wenn Du dann paint bzw. paintComponent überschreibst, dann kannst Du in der Methode alle Kreise. die Du Dir gemerkt hast, malen.
==> Schon bleibt alles bestehen, auch wenn Du das Fenster z.B. minimierst und wieder herstellst.
Siehe dazu z.B. auch
http://openbook.rheinwerk-verlag.de/javainsel/17_010.html#u17.10