[Java] Utilizar un ArrayList en un JFrame

Hola, estoy realizando un pequeño programa, el cual consiste en que, al hacer clic en un panel se dibuje un circulo, y cuando se vuelva hacer clic, se dibuje otro círculos de otro color, pero sin que se borre el primer circulo, y así hasta tapizar el panel de círculos de diferentes colores.

Mi pregunta es, ¿como almacenar los círculos en la memoria, para que no se borren?, ya tengo el evento del clic y que los círculos cambien de color, he estado investigando como hacer esto, tengo entendido que se puede hacer con un ArrayList o con un Vector.

Mi codigo:


package Graficos;

import java.awt.Color;
import java.awt.Graphics;
import java.awt.Graphics2D;
import java.awt.GraphicsEnvironment;
import java.awt.event.MouseAdapter;
import java.awt.event.MouseEvent;
import java.awt.event.MouseListener;
import java.awt.geom.Ellipse2D;
import java.util.ArrayList;
import java.util.Random;
import javax.swing.JFrame;
import javax.swing.JPanel;

public class Graficos2D {
public static void main(String[] args) {
Marco NewMarco = new Marco();
NewMarco.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
}
}
class Marco extends JFrame {
int x;
       int y;
       int radio;
public Marco() {
setVisible(true);
setSize(500,500);
x = getSize().width/2;
               y = getSize().height/2;
setTitle("Dibujando Circulos");
       addMouseListener(new MouseAdapter(){
           @Override
           public void mouseClicked(MouseEvent e) {
               super.mouseMoved(e);
               x=e.getX();
               y=e.getY();
               repaint();
           }
       });
}
@Override
public void paint(Graphics g) {
super.paint(g);
               radio = 25;
Random r = new Random();
Graphics2D g2=(Graphics2D) g;
g2.setColor(new Color(r.nextInt(255),r.nextInt(255),r.nextInt(255)));
Ellipse2D circulo=new Ellipse2D.Float(x-radio, y-radio, radio*2, radio*2);
g2.fill(circulo);
}
       class EventoMouse {
           public EventoMouse(){
           }
       }
}

Con toda sinceridad, he estado haciendo este programa por una semana, y he buscado por todas partes, la verdad no espero que la respuesta me caiga del cielo, si conocen una pagina o un tutorial se los agradeceré, oh si pueden explicarme como realizarlo se los agradeceré.

Opciones de visualización de comentarios

Seleccione la forma que prefiera para mostrar los comentarios y haga clic en «Guardar las opciones» para activar los cambios.
Imagen de adrianaaae

Tal vez esto es lo que buscas

Tengo código que hace algo parecido a lo que quieres, te lo comparto y Saludos.

package CirculosVectoriales;

import java.awt.Color;
import java.awt.Graphics;
import java.util.ArrayList;
import java.util.List;
import java.util.Random;

/**
 *
 * @author adrian.ake
 */

public class FrmCirculos extends javax.swing.JFrame {

    public Graphics graphics;
    List<Color> colores_utilizados = new ArrayList<Color>();

    /**
     * Creates new form FrmCirculos
     */

    public FrmCirculos() {
        initComponents();
    }

    /**
     * This method is called from within the constructor to initialize the form.
     * WARNING: Do NOT modify this code. The content of this method is always
     * regenerated by the Form Editor.
     */

    @SuppressWarnings("unchecked")
    // <editor-fold defaultstate="collapsed" desc="Generated Code">                          
    private void initComponents() {

        setDefaultCloseOperation(javax.swing.WindowConstants.EXIT_ON_CLOSE);
        addMouseListener(new java.awt.event.MouseAdapter() {
            public void mouseClicked(java.awt.event.MouseEvent evt) {
                formMouseClicked(evt);
            }
        });

        javax.swing.GroupLayout layout = new javax.swing.GroupLayout(getContentPane());
        getContentPane().setLayout(layout);
        layout.setHorizontalGroup(
            layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
            .addGap(0, 668, Short.MAX_VALUE)
        );
        layout.setVerticalGroup(
            layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
            .addGap(0, 462, Short.MAX_VALUE)
        );

        pack();
    }// </editor-fold>                        

    private void formMouseClicked(java.awt.event.MouseEvent evt) {                                  
        int x = evt.getX();
        int y = evt.getY();
        int radius = 29;//radio del circulo que será pintado

        graphics = this.getGraphics();
        graphics.setPaintMode();
        graphics.setColor(this.getRandomColor());
        graphics.fillArc(x, y, radius, radius, 0, 360);
    }                                
    /**
     * Metodo para la obtencion de un color aleatorio
     *
     * @return
     * @autor adrian.ake
     */

    private Color getRandomColor() {
        Random rand = new Random();
        float r = rand.nextFloat();
        float g = rand.nextFloat();
        float b = rand.nextFloat();
        Color randomColor = new Color(r, g, b);
        if (!this.getColores_utilizados().contains(randomColor)) {
            this.getColores_utilizados().add(randomColor);
        } else {
            return this.getRandomColor();
        }
        return randomColor;
    }

    public List<Color> getColores_utilizados() {
        return colores_utilizados;
    }

    public void setColores_utilizados(List<Color> colores_utilizados) {
        this.colores_utilizados = colores_utilizados;
    }

    /**
     * @param args the command line arguments
     */

    public static void main(String args[]) {
        /* Set the Nimbus look and feel */
        //<editor-fold defaultstate="collapsed" desc=" Look and feel setting code (optional) ">
        /* If Nimbus (introduced in Java SE 6) is not available, stay with the default look and feel.
         * For details see <a href="http://download.oracle.com/javase/tutorial/uiswing/lookandfeel/plaf.html" title="http://download.oracle.com/javase/tutorial/uiswing/lookandfeel/plaf.html">http://download.oracle.com/javase/tutorial/uiswing/lookandfeel/plaf.html</a>
         */

        try {
            for (javax.swing.UIManager.LookAndFeelInfo info : javax.swing.UIManager.getInstalledLookAndFeels()) {
                if ("Nimbus".equals(info.getName())) {
                    javax.swing.UIManager.setLookAndFeel(info.getClassName());
                    break;
                }
            }
        } catch (ClassNotFoundException ex) {
            java.util.logging.Logger.getLogger(FrmCirculos.class.getName()).log(java.util.logging.Level.SEVERE, null, ex);
        } catch (InstantiationException ex) {
            java.util.logging.Logger.getLogger(FrmCirculos.class.getName()).log(java.util.logging.Level.SEVERE, null, ex);
        } catch (IllegalAccessException ex) {
            java.util.logging.Logger.getLogger(FrmCirculos.class.getName()).log(java.util.logging.Level.SEVERE, null, ex);
        } catch (javax.swing.UnsupportedLookAndFeelException ex) {
            java.util.logging.Logger.getLogger(FrmCirculos.class.getName()).log(java.util.logging.Level.SEVERE, null, ex);
        }
        //</editor-fold>

        /* Create and display the form */
        java.awt.EventQueue.invokeLater(new Runnable() {
            public void run() {
                new FrmCirculos().setVisible(true);
            }
        });
    }

    // Variables declaration - do not modify                    
    // End of variables declaration                  
}