Problemas com o paintComponent da JPanel!

To tentando fazer uma animação. Ai queria fazer com que um sprit se movimentasse na tela. Mas ele não se movimenta! Tudo que esta no metodo paintComponent é printado na JPanel inclusive a primeira imagem da sprit, mas quando eu clico no telcado com a seta para esquerda assim como para a direita a sprite não se meche! Já fiz teste p ver se estes metodos estão sendo acessados e sim eles estão! Mas não sei o que se passa. Vou passar as partes do codigo que julgo o necessario:

Eis a classe que trata o evento pelo teclado, quando clicadas as setas esquerda e direita, é chamado o metodo que modifica o atributo x

[code]package Eventos;

import gui.Cenario;

import java.awt.event.KeyAdapter;
import java.awt.event.KeyEvent;
import java.awt.event.KeyListener;

import sprites.Dragao;
import sprites.Mario;

public class TrataTeclado implements KeyListener{

Mario mario;
Cenario cen;

public TrataTeclado(){
			mario = new Mario();
			cen = new Cenario();
}		
		
public void keyPressed(KeyEvent e) {
			
       descansar();
	if (e.getKeyCode() == KeyEvent.VK_LEFT){
		cen.movimentoEsquerda();
		System.out.println("esquerda");
	}

	if (e.getKeyCode() == KeyEvent.VK_RIGHT){
		 cen.movimentoDireita();
		 System.out.println("direita");
	}
							
}

public void keyReleased(KeyEvent evt) {
		
}


private void addKeyListener(KeyAdapter keyAdapter) {
	// TODO Auto-generated method stub
	
}

public void descansar() {
	try {
		Thread.currentThread();
		Thread.sleep(40);
	} catch (Exception e) {
	
	}
}

@Override
public void keyTyped(KeyEvent arg0) {
	// TODO Auto-generated method stub
	
}

}[/code]

Aqui a classe q printa os objetos na tela… como tava dando pau eu deixei tudo q era p ser printado em comentario p o copilador ignorar e resolvi fazer um teste com um retangulo ao invez da sprite mas mesmo assim ele não se movimenta na tela:

[code]public class Cenario extends JComponent {

Image IMAGEMDAVEZ;
Image IMAGEMDAVEZD;

Image chao;
Image chao1;
Image chao2;
Image chao3;
Image chao4;

Image subSolo;

Image fundo1;

Image quadrinho;

Mario mario = new Mario();
Dragao dragao = new Dragao();

List < Image > dragaoEsquerda = new ArrayList<Image>();

int x2 = 800;
int x3 = 600;
public Cenario(){
	
	esquerda1 =  Toolkit.getDefaultToolkit().getImage("C:/Users/Jhonatan/Desktop/JAVA_MARIO/O_Jogo/src/sprites/blueDragon1.png");
	esquerda2 =  Toolkit.getDefaultToolkit().getImage("C:/Users/Jhonatan/Desktop/JAVA_MARIO/O_Jogo/src/sprites/blueKoopa2.png");
	
	
	dragaoEsquerda.add(esquerda1);
	dragaoEsquerda.add(esquerda2);
	
	IMAGEMDAVEZ = mario.verificaImgDaVez();
	IMAGEMDAVEZD = dragaoEsquerda.get(0);
	
	chao = Toolkit.getDefaultToolkit().getImage("C:/Users/Jhonatan/Desktop/JAVA_MARIO/O_Jogo/src/gui/chao0.png");
	subSolo = Toolkit.getDefaultToolkit().getImage("C:/Users/Jhonatan/Desktop/JAVA_MARIO/O_Jogo/src/gui/sub0.png");
	chao1 = Toolkit.getDefaultToolkit().getImage("C:/Users/Jhonatan/Desktop/JAVA_MARIO/O_Jogo/src/gui/chao1.png");
	chao2 = Toolkit.getDefaultToolkit().getImage("C:/Users/Jhonatan/Desktop/JAVA_MARIO/O_Jogo/src/gui/chao2.png");
	chao3 = Toolkit.getDefaultToolkit().getImage("C:/Users/Jhonatan/Desktop/JAVA_MARIO/O_Jogo/src/gui/chao3.png");
	chao4 = Toolkit.getDefaultToolkit().getImage("C:/Users/Jhonatan/Desktop/JAVA_MARIO/O_Jogo/src/gui/chao4.png");
	
	fundo1 = Toolkit.getDefaultToolkit().getImage("C:/Users/Jhonatan/Desktop/JAVA_MARIO/O_Jogo/src/gui/fundo1.png");
	
	quadrinho = Toolkit.getDefaultToolkit().getImage("C:/Users/Jhonatan/Desktop/JAVA_MARIO/O_Jogo/src/gui/quadrinho.png");
	
	
}

public void movimentoEsquerda(){
	this.xM = xM - 5;
	//repaint();
}

public void movimentoDireita(){
     this.xM = xM + 5;
     System.out.println("valor x "+xM);
     //repaint();
}



int xM = 0	;

 public void paintComponent(Graphics g){
  	 	super.paintComponent(g);
  	 	
  	 	/**Mario**/
  	 	//g.drawImage(IMAGEMDAVEZ, this.xM, 722, this);
                   
                   g.drawRect(this.xM, 722, 20, 20);
                super.repaint(); 	 	
  	 	
                    /**Dragao
  	 	g.drawImage(IMAGEMDAVEZD, dragao.ande(), 722, this);

  	 	/**Desenha o chão superficial**
  	 	int pos = 0;
  	 	for(int i = 0; i < 31; i++){
			g.drawImage(chao,pos,786,this);
			pos += 32;
  	 	}
  	 	g.drawImage(chao1,960,786,this);
  	 	pos = 754;
  	 	for(int i = 0; i < 4; i++){
			g.drawImage(chao2,960,pos,this);
			pos -= 32;
  	 	}
  	 	g.drawImage(chao3,960,626,this);
  	 	pos = 992;
  	 	for(int i = 0; i < 14; i++){
			g.drawImage(chao,pos,626,this);
			pos += 32;
  	 	}
  	 	
  	 	/**Desenha o subsolo **
  	 	pos = 0;
  	 	for(int i = 0; i < 45; i++){
			g.drawImage(subSolo,pos,818,this);
			pos += 32;
  	 	}
  	 	pos = 658;
  	 	int posX = 992;
  	 	for(int i = 0; i < 5; i++){
  	 		for(int j = 0; j< 14 ; j++){
			g.drawImage(subSolo,posX,pos,this);
			posX += 32;
  	 		}
  	 		posX = 992;
  	 		pos +=32;
  	 	}
  	 	
  	 	/**quadrinhos **
  	 	g.drawImage(quadrinho,1100,520,this);
  	 	g.drawImage(quadrinho,1300,470,this);
  	 	g.drawImage(quadrinho,1100,400,this);
  	 	g.drawImage(quadrinho,1300,350,this);
  	 	g.drawImage(quadrinho,1000,300,this);
  	 	
  	 	
  	 	super.repaint();*/
 }[/code]

[b]Então, como toda vez q o evento é tratado a variavel xM é modificada. Logo o meto paintComponent teria de repinta o retangulo na região da nova coordenada x, já que ela é printada aonde vale o valor de xM.

Alguem sabe o que eu devo fazer? Grato![/b]

 public void paintComponent(Graphics g){  
             super.paintComponent(g);  
              Graphics2D g2d = (Graphics2D) g.create();         
              g2d.drawRect(this.xM, 722, 20, 20); 
              g2d.dispose(); 

A chamada para repaint tem que ser feito onde altera o atributo mesmo.