Lembre-se. Nem o paintComponent, nem o JPanel, estão preocupados em guardar qualquer tipo de estado sobre a pintura. Toda vez que o método paintComponent é chamado, a primeira coisa que o painel faz é apagar todo seu conteúdo.
Para solucionar esse problema, você tem duas alternativas:
a) Criar uma lista dos objetos que o usuário já desenhou, e rodar o método de desenho para a lista inteira. O legal dessa alternativa é que ocê pode permitir ao usuário desenhar em camadas, movimentar objetos e fazer coisas que um Corel da vida deixaria ele fazer. Mas é mais complexo. No exemplo que eu te passei, note que uma lista de pontos é criada, e esses pontos são sempre redesenhados.
b) Desenhar numa BufferedImage, que não é apagada. Para fazer com BufferedImage, crie uma nova BufferedImage do tamanho do seu painel. No mouseDragged desenhe nessa BufferedImage e não diretamente no painel.
O procedimento é praticamente igual:
Primeiro você declara esse atributo na sua classe (eu normalmente inicializo no construtor, pois é necessário saber as dimensões do painel, só deixei aqui para você ver os parâmetros do construtor do BufferedImage):
BufferedImage img = new BufferedImage(painel.getWidth(), painel.getHeight(), BufferedImage.TYPE_INT_ARGB);
Esse aqui é seu método de pintura. Sempre sobre a mesma BufferedImage:
private void desenhaOval(int x, int y)
{
Graphics2D graficos = (Graphics2D) img.getGraphics().create();
graficos.setColor(Color.GREEN);
graficos.fillOval(x, y, 20, 20);
graficos.dispose();
}
Finalmente, isso aqui você põe no seu paintComponent:
private void paintComponent(Graphics2D g)
{
super.paintComponent(g);
//O drawImage não altera o estado de g,
//então não precisamos fazer cópia.
g.drawImage(img, 0, 0, null);
}