Problemas com sleep

9 respostas
P

Estou querendo mostrar uma mensagem na tela e após 5 segundos esconder essa mensagem, para isso tendei executar da seguinte maneira:

lblConfirmacao.setVisible(true);

Thread t = new Thread();

try {

t.sleep(5000);

}catch(Exception es){

System.out.println(es);

}finally{

lblConfirmacao.setVisible(false);

}

Mas quando executo ele pausa a tela, mas não mostra o label na tela (está executando o setVisible(true), apenas no final do sleep) . Tem alguma maneira de obrigar o programa a primeiro mostrar o componente na tela para depois executar o sleep???

Obrigado.

9 Respostas

Elvis.The.Pelvis

Mmmmm perai. Pelo que eu entendo de thread se voce fizer:

Thread t = new Thread();

try {

t.sleep(5000);

.

.

.

O sue thread t é que dorme por 5 segundos não sua aplicação. O código deveria passar rapidamente por isso e imediatamente executar o set visible false. (Me corrijam se eu estiver errado).

Agora voce pode fazer

class ThreadPreguiçoso extends Thread {
  JLabel lbl = null;

  public ThreadPreguiçoso(JLabel lbl) {
    super();
    this.lbl = lbl;
  }

  public void run() {
    sleep(5000);
    lbl.setVisible(false);
  }
}

 vc faz

lblConfirmacao.setVisible(true); 
ThreadPreguiçoso t = new Thread(lblConfirmacao); 
try { 
  t.start();
} catch(Exception es) { 
  System.out.println(es); 
}

O que acontece é que você parece não conhecer bem sobre threads java. Você chamou o sleep() sem nem mesmo dar um Thread.start(). O que, ou não faz nada ou lança uma exceção.

Claro que essa solução que dei talvez não seja a melhor (criar uma nova classe para algo simples), mas ela mostra os conceitos de Threads, como start() sleep() etc… Leia o Core Java volume 2 capítulo 1 - Threads. Muito legal e você aprende muito sobre eles.

Qquer dúvida…

Rafael_Steil

Voce pode simplesmente chamar Thread.sleep() diretamente, pois o thread usado sera o da aplicacao. No caso nao funcionou porque a aplicacao nao foi criada usando threads, e por isso que ele primeiro passa os 5 segundos para depois esconder a janela.
A solucao do Mr. Elvis deve funcionar.

Rafael

Elvis.The.Pelvis

Mas se você chamar Thread.sleep() a aplicação não vai travar pelo tempo passdo como parâmetro? Claro que a captação de eventos é uma thraed a parte, mas não sei se rola assim não. è válido para um abom teste não acham?

Rafael_Steil

Sim, ela vai travar.

Rafael

richardpeder

O problema eh que vc esta colocando a thread para dormir antes de dar start nela…faz assim:

Thread t = new Thread();

t.start();
//coloca os comandos que quiser
t.sleep(5000);

Espero ter ajudado…

Elvis.The.Pelvis

Richard, essa solução não funciona. Veja bem, o Thread que “dorme” é o que você criou. O thread da aplicação continua executando normalmente.

richardpeder

Então desconsiderem minha resposta, caso esteja mesmo errada… :lol:

Ate mais…

urubatan

o correto seria:

blConfirmacao.setVisible(true);

try {

Thread.currentThread().sleep(1000);

}catch(Exception es){

System.out.println(es);

}finally{

lblConfirmacao.setVisible(false);

}
P

Primeiramente agradeço a todos pela ajuda,

Testei todas as possibilidades que vocês me deram, e gostaria de repassar, para caso alguém esteja com o mesma dúvida, que a solução fornecida pelo anjo mal funcionou 100%.

Por isso caso alguém esteje procurando a solução de um problema similar ao meu recomendo se passear no exemplo colocado por ele.

Obrigado a todos pela ajuda.

[]'s

Criado 3 de janeiro de 2003
Ultima resposta 6 de jan. de 2003
Respostas 9
Participantes 5