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.
Problema com Thread.sleep em while ( Por favor deem uma olhada )
7 Respostas
alguém por favor ? 
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
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…
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);
}
}
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.
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;
}
}
Muito bem beables, meus parabens e foi bem esperto em postar o código para os proximos…
Continue consciente…
Att
Ricoldi