Delay

5 respostas
R

Eu sei que já foi aberto um tópico sobre isso mais e peço ajuda pelo amor de Deus…

Eu preciso fazer um pequeno Delay… só isso… só que fazendo do jeito tradicional veja o código:

jTextField_PainelActionPerformed(java.awt.event.ActionEvent evt) {
jLabel_Mensagem.setText(“PONTO REGISTRADO !!!”);

//DELAY 
        try {  
            Thread.sleep(1000);  
        } catch (Exception e) {  
           e.printStackTrace();  
        }  

        jTextField_Painel.setText(null);
        jLabel_Mensagem.setText(null);          
    
}

Simplesmente nao funciona ele executa primeiro o Sleep e depois o jLabel_Mensagem.setText(“PONTO REGISTRADO !!!”);

5 Respostas

ViniGodoy

Me parece que o problema é que você está congelando a thread da AWT. O que ocorre é que, no momento que você faz um setText(), uma mensagem é enviada para GUI e empilhada numa pilha da AWT. Entretanto, essa mensagem na é processada, pois a thread da AWT é congelada pelo seu sleep().

Para resolver o problema, me parece que a solução é fazer o sleep numa thread separada e, só depois disso, pedir para a thread da AWT limpar as caixas de texto.

Teste aí e vê se funciona:

jTextField_PainelActionPerformed(java.awt.event.ActionEvent evt) {
    jLabel_Mensagem.setText("PONTO REGISTRADO !!!");
    new Thread(new Runnable() {
        public void run() {
            try {
                Thread.sleep(1000);
            } catch (Exception e) {}
    
            EventQueue.invokeLater(new Runnable() {
                public void run() {
                    jTextField_Painel.setText(null);
                    jLabel_Mensagem.setText(null);
                }
            });
        }
    }).start();
}

PS: Da próxima vez que postar códigos, use a tag code, assim como eu fiz. Para mais informações sobre essa tag leia: http://www.guj.com.br/posts/list/50115.java

R

Putz Vinicius Valeu mesmo cara…
Vc sabe o que é ficar 2 dias batendo cabeça com uma porcariazinha…
Funcionou perfeito…
Cara se precisar de mim pra qualquer coisa estamos ai…

Só não consegui entender direito o seguinte…
Eu substitui aquele Trhead.Sleep por um simples for(int i=0;int<1000;i++)
Mesmo assim cara ele dá errado… Parece que pula uma linha de execução…

Más do seu jeito deu perfeito…

ViniGodoy

Você tem que entender que o seu código está rodando na thread da AWT. Qualquer comando que gere delay (seja o for ou o sleep) irá parar essa thread, que não processará os eventos de pintura.

Se você, por exemplo, rodasse uma consulta num BD que demorasse meia hora, a tela ficaria meia hora “congelada”, por mais que no meio do caminho você colocasse comandos para atualizar um status bar.

O que eu fiz foi simplesmente fazer outra thread esperar um segundo. Enquanto isso, a thread da AWT fica livre para processar os eventos e pintar a sua mensagem de texto. Depois de um segundo, eu peço para a outra thread requisitar a AWT que limpe as mensagens de texto (usando o InvokeLater).

O Java 6 incluiu uma classe nova para lidar com esse problema, chamada SwingWorker. Você pode ver mais informações aqui:
http://java.sun.com/docs/books/tutorial/uiswing/concurrency/index.html

Wolf_X

oi vini , to tentando aprender um pouco sobre thread e tava dando uma olhada no seu codigo , to com uma duvida , vc criou um action performed em cima do JText q tava dentro da classe q o cara criou extendendo a JFrame neh ?
eu posso usar esse esquema qdo desejo checar um determinado componente da AWT periodicamente???
no caso eu tenho uma classe soh de actionperformed , posso inserir esse nela e add ela ao componente q eu quero checar?

sei q ta parecendo meio confuso , mas eh PQ EU TO MEIO CONFUSO hahahahahahah,
brigadao!!!

ViniGodoy

Oi.

Para verificar o valor de um componente, geralmente usamos um listener ao invés de threads. Você pode usar um evento (como ActionPerformed ou ValueChanged) para que o componente te informe toda vez que seu valor for alterado, assim você não precisa recorrer a threads e nem a pooling.

A técnica para fazer isso com threads é muito parecida, mas você só deve recorrer a ela se for estritamente necessária. Como você só vai ler valores, não tem stress com a fila de mensagens da AWT. Você pode conferir alguns exemplos do uso de threads nesse tópico:

http://www.guj.com.br/posts/list/52964.java#279083

Aqui tem três exemplos, usando thread, timer do util e o timer do swing. Não se esqueça de olhar na página dois.

Qualquer dúvida, crie um tópico específico para isso, dizendo o que você quer fazer e qual a sua dúvida que a galera daí te ajuda! :wink:

Criado 8 de fevereiro de 2007
Ultima resposta 26 de fev. de 2007
Respostas 5
Participantes 3