初心者です、質問失礼します。
現在javaswingを使って、キー入力したら円が広がりながら消えていく、というパーティクルのようなアニメーションを作りたいと思っています。JPanelを継承したSpreadCircleでキー入力を監視して、入力されたらCircleをインスタンス化してアニメーション開始するのですが、その際repaint()を呼び出しているのにも関わらず画面に変化がありません。
なぜうまくアニメーションが表示されないのでしょうか?

また、paintComponentの仕組みがよくわかっていないため、JPanelを継承したクラス以外からrepaint()g.fillOval()のようなGraphicsの情報を更新する方法がわかりません。
色々と考えてGraphics2Dの変数やSpreadCircleの変数をstaticにして見たのですがうまくいきませんでした。もっとスマートにGraphicsの更新(JPanelfillOvalrepaint等)を行う方法があれば教えていただけると幸いです。

Frame_of_SpreadCircle.java

import javax.swing.JFrame;

public class Frame_of_SpreadCircle{
    static SpreadCircle panel = new SpreadCircle();

    public static void main(String args[]) {
        JFrame frame = new JFrame("SpreadCircle");

        frame.addKeyListener(panel);
        frame.add(panel);
        frame.setDefaultCloseOperation(frame.EXIT_ON_CLOSE);
        frame.pack();
        frame.setVisible(true);
    }
}

SpreadCircle.java

public class SpreadCircle extends JPanel implements KeyListener {
    public static final int size = 50;
    public static Graphics2D g2;

    public SpreadCircle(){
        super();
        setPreferredSize(new Dimension(600,400));
        setBackground(Color.GRAY);
    }

    @Override
    public void keyTyped(KeyEvent e) {
        // TODO 自動生成されたメソッド・スタブ
        Circle circle = new Circle(size);
        circle.drawCircle();
    }

    public void paintComponent(Graphics g) {
        g2 = (Graphics2D) g;
        super.paintComponent(g2);
        g2.setRenderingHint(KEY_ANTIALIASING, VALUE_ANTIALIAS_ON);

    }

    @Override
    public void keyPressed(KeyEvent e) {
        // TODO 自動生成されたメソッド・スタブ

    }

    @Override
    public void keyReleased(KeyEvent e) {
        // TODO 自動生成されたメソッド・スタブ

    }
}

Circle.java

public class Circle implements ActionListener  {
    int x;
    int y;
    int l;
    int a;
    int b;
    int c;
    int alpha = 100;
    int time = 0;
    Timer timer = new Timer(60,this);
    Color color ;

    public Circle(int w) {
        l = w;
        x = (int) (Math.random() * 300);
        y = (int) (Math.random() * 200);

        a = (int) (Math.random() * 256);
        b = (int) (Math.random() * 256);
        c = (int) (Math.random() * 256);
        color = new Color(a,b,c,alpha);

        timer.start();
    }

    public void drawCircle() {
        SpreadCircle.g2.setColor(color);
        SpreadCircle.g2.fillOval(x, y, l, l);
        Frame_of_SpreadCircle.panel.repaint();
    }

    public void actionPerformed(ActionEvent e) {
        // TODO 自動生成されたメソッド・スタブ
        if(time < 10) {
            l += 3;
            alpha -= 10;

            drawCircle();
            Frame_of_SpreadCircle.panel.repaint();
        }else {
            SpreadCircle.g2.dispose();
            timer.stop();
        }
        time++;
    }
}