Problemas com o paintComponent da JPanel!

1 resposta
J

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

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
		
	}
}

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:

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();*/
	 }

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!

1 Resposta

Marky.Vasconcelos
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.

Criado 12 de junho de 2009
Ultima resposta 15 de jun. de 2009
Respostas 1
Participantes 2