Problema com Thread.sleep em while ( Por favor deem uma olhada )

7 respostas
B

Duvida Thread.sleep
Estou usando o Thread.sleep dentro de um while.
O problema é que o Label não esta sendo atualizado toda vez que há a repetição.
Ele simplesmente trava por um tempo e pula pro outro lado da tela…
Alguem tem alguma sugestão ?
Segue abaixo o código com o Listener e o método que move o Label.
O while com o Thread.sleep encontra-se na classe Bixo no método do Listener.

7 Respostas

B

alguém por favor ? :frowning:

maquiavelbona

http://guj.com.br/posts/list/60158.java

ricoldi

Se vc postou uma pergunta não tem mais nada a fazer aqui alem de esperar… ninguem ganha nada em responder perguntas no forum.

Ao invez de ficar dando refresh vai pesquisar o problema.

Espero que intenda.

Sobre seu problema coloque a chamada do metodo que possui este while com Thread.sleep() dentro de uma outra Thread, pois o que deve estar acontecendo é que a interface fica travada enquanto o laço roda. conseguiu intender o que eu disse?

Att
Ricoldi

maior_abandonado

kra eu fui pega a sua classe pra executa, pra ver o q q tva acontecendo (gosto de fazer isso antes de tentar entende-la)

e a sua classe não tem sequer um main… intendo q vc estehja chamando ela a partir de outra mais sendo assim poste a outra também…no minimo

se me permite um conselho, use as tags code e cole o seu código… fica mais facil de alguem " kerer te ajudar"

outro conselho tb é vc saber esperar pelo menos um pouco, se vc posta denoite, eu até comprienderia vc pedir ajuda denovo no dia seguinte, e preferencialmente a tarde (ja q mtos poderiam não ter visto o tópico q vc crio)… agora, vc abrir o tópico anoite (fora do horario comercial deve ter mta gente q nao entra mais no forum) e querer uma resposta em 2 horas, sendo que ninguem é obrigado a te ajudar é querer demais…

B
ok desculpem por ser impaciente. vou postar o código. Classe da tela.
import javax.swing.*;
import java.awt.*;
import java.awt.event.*;

public class PacMan{
	public static void main ( String args[] ){
		JFrame Frame = new JFrame("PacMan");
		JLayeredPane LPane = new JLayeredPane();
		Bixo Jpacman = new Bixo(0);
		LPane.add(Jpacman.getImagem());
		JLabel Labirinto = new JLabel(new ImageIcon("Labirinto.gif"));
		Labirinto.setBounds(new Rectangle(0,0,600,660));
		LPane.add(Labirinto);
		JLabel[][] MatLab = new JLabel[30][33]; 
		Frame.addKeyListener(Jpacman);
		Frame.add(LPane);
		Frame.setSize(616,696);
		Frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
		Frame.setVisible(true);
	}
}
Classe Bixo.
import javax.swing.*;
import java.awt.*;
import java.awt.event.*;

public class Bixo implements KeyListener{
	public JLabel imagem;
	private int vidas;
	public int X;
	public int Y;
	public int largura;
	public int altura;
	
	public Bixo(int i) {
		if (i==0){
			imagem = new JLabel(new ImageIcon("pacman0.gif"));
			largura=30;
			altura=30;
		} else{
			imagem = new JLabel(new ImageIcon("Fantasma"+i+".gif"));
			largura=35;
			altura=35;
		}
		X=20;
		Y=20;
		imagem.setBounds(new Rectangle(X,Y,largura,altura));
		vidas=3;
	}
		
	//Metodos que tem que ser implementados por causa da interface keyListener
	public void keyReleased(KeyEvent evt){}
	public void keyTyped(KeyEvent evt) {}
	
	//Listener que captura se as flechas foram pressionadas
	public void keyPressed(KeyEvent evt){
		if (evt.getKeyCode()==KeyEvent.VK_LEFT){ //Flecha para a esquerda
			Andar(1);
		}
		if (evt.getKeyCode()==KeyEvent.VK_RIGHT){ //Flecha para a direita
			while (X<546){
				Andar(0);
				try{Thread.sleep(1000);}
				catch(Exception e){}
			}
		}
		if (evt.getKeyCode()==KeyEvent.VK_UP){ //Flecha para cima
			Andar(3);
		}
		if (evt.getKeyCode()==KeyEvent.VK_DOWN){ //Flecha para baixo
			Andar(2);
		}
	}
		
	public void Andar(int i){
		if (i==0){ //direita
			if (X<546){
				X+=5;
				atualiza(i);
			}
		}
		if (i==1){ //esquerda
			if (X>24){
				X-=5;
				atualiza(i);
			}
		}
		if (i==2){ //baixo
			if (Y<606){
				Y+=5;
				atualiza(i);
			}
		}
		if (i==3){ //cima
			if (Y>24){
				Y-=5;
				atualiza(i);
			}
		}
	}
	
	public void atualiza(int i){
		imagem.setLocation(X,Y);
		imagem.setIcon(new ImageIcon("pacman"+i+".gif"));
	}
	
	public int getX(){
		return X;
	}
	
	public int getY(){
		return Y;
	}
	
	public JLabel getImagem(){
		return imagem;
	}
}

Obrigado aos que ajudaram ^^
Sou novo no fórum então não sabia como postar o código.

B

Bom.. problema resolvido.
Coloquei a Thread que voce falou ricoldi.. e funcionou muito bem. Brigadão.
Vo postar o código só pra caso alguem tenha a mesma pergunta jah ter a solução.

import javax.swing.*;
import java.awt.*;
import java.awt.event.*;

public class Bixo implements KeyListener, Runnable{
	public JLabel imagem;
	private boolean stop=true;
	private int vidas;
	public int X;
	public int Y;
	public int largura;
	public int altura;
	public Thread tAndar;
	
	public Bixo(int i) {
		if (i==0){
			imagem = new JLabel(new ImageIcon("pacman0.gif"));
			largura=30;
			altura=30;
		} else{
			imagem = new JLabel(new ImageIcon("Fantasma"+i+".gif"));
			largura=35;
			altura=35;
		}
		X=20;
		Y=20;
		imagem.setBounds(new Rectangle(X,Y,largura,altura));
		vidas=3;
	}
	
	public void run(){
		while(X<546){
			Andar(0);
			try{Thread.sleep(30);}
			catch(Exception e){}
		}
	}
	
	//Metodos que tem que ser implementados por causa da interface keyListener
	public void keyReleased(KeyEvent evt){}
	public void keyTyped(KeyEvent evt) {}
	
	//Listener que captura se as flechas foram pressionadas
	public void keyPressed(KeyEvent evt){
		if (evt.getKeyCode()==KeyEvent.VK_LEFT){ //Flecha para a esquerda
			Andar(1);
		}
		if (evt.getKeyCode()==KeyEvent.VK_RIGHT){ //Flecha para a direita
			tAndar = new Thread(this, "Andar");
			tAndar.start();
		}
		if (evt.getKeyCode()==KeyEvent.VK_UP){ //Flecha para cima
			Andar(3);
		}
		if (evt.getKeyCode()==KeyEvent.VK_DOWN){ //Flecha para baixo
			Andar(2);
		}
	}
	
	public void Andar(int i){
		if (i==0){ //direita
			if (X<546){
				X+=5;
				atualiza(i);
			}
		}
		if (i==1){ //esquerda
			if (X>24){
				X-=5;
				atualiza(i);
			}
		}
		if (i==2){ //baixo
			if (Y<606){
				Y+=5;
				atualiza(i);
			}
		}
		if (i==3){ //cima
			if (Y>24){
				Y-=5;
				atualiza(i);
			}
		}
	}
	
	public void atualiza(int i){
		imagem.setLocation(X,Y);
		imagem.setIcon(new ImageIcon("pacman"+i+".gif"));
		imagem.repaint();
	}
	
	public int getX(){
		return X;
	}
	
	public int getY(){
		return Y;
	}
	
	public JLabel getImagem(){
		return imagem;
	}
}
ricoldi

Muito bem beables, meus parabens e foi bem esperto em postar o código para os proximos…

Continue consciente…

Att
Ricoldi

Criado 2 de julho de 2008
Ultima resposta 3 de jul. de 2008
Respostas 7
Participantes 4