Bom pessoal... No meu Frame eu tenho um botão que faz uma contagem regreciva de 30 segundos...
Quando acaba a contagem, aparece uma mensagem de "Pedido enviado com sucesso", o tempo que chegou em 0 volta para 30 (para caso eu clicar no botão novamente).
Quando o tempo chegasse em 30, a Thread deveria "morrer"...
Eu fiz uma gambiarra:
privateclassClockRunnableimplementsRunnable{publicvoidrun(){try{intt=31;while(true){EventQueue.invokeLater(newRunnable(){publicvoidrun(){}});Thread.sleep(1000);if(t>=1){t--;Stringk=Integer.toString(t);jLabel11.setText(k);}else{JOptionPane.showMessageDialog(null,"Pedido enviado com sucesso.");t=30;//Thread.sleep(999999999); ////////GAMBIARRA FEIAAAA!! ////// }}}catch(InterruptedExceptione){}}}
Olhem a linha 21..
O que eu deveria fazer para a contagem parar? (Se não depois dos 30 segundos, de 1 em 1 vai ficar exibindo a mensagem "Pedido enviado com sucesso")
privateclassClockRunnableimplementsRunnable{publicvoidrun(){try{intt=31;while(true){Thread.sleep(1000);if(t>=1){t--;Stringk=Integer.toString(t);jLabel11.setText(k);}else{JOptionPane.showMessageDialog(null,"Pedido enviado com sucesso.");list1.clear();t=31;return;}}}catch(InterruptedExceptione){}}}
Bom...
Agora eu quero criar um botão Cancelar, que quando clica nele, a contagem VOLTAR PRO 31.
Ela deve VOLTAR PRO 31, não parar..
Ex.: 10,9,8,7,6,5,4 cliquei no botão... Então a Thread para, e a contagem volta pro 31, para caso eu clique no botão começar dinovo...
Como poderia fazer isso?
laudenpower
ViniGodoy:
A linha 21 deve ser
return;
Para que uma thread pare, simplesmente saia do método run.
Outra opção é fazer seu while terminar, ao invés de usar while (true):
private class ClockRunnable implements Runnable {
public void run() {
try {
int t=30;
while (t > 0) {
Thread.sleep(1000);
jLabel11.setText(Integer.toString(t));
t--;
}
JOptionPane.showMessageDialog(null,"Pedido enviado com sucesso.");
} catch (InterruptedException e) {
JOptionPane.showMessageDialog(null,"Pedido interrompido.");
}
}
}
Por isso que eu digo, vivendo e aprendendo… Tinha me esquecido de como o return é útil nesses casos, nesse caso eu teria pensado em faze-la parar de processar com algum if, mas com return fica mais simples, e também não sabia que para fazer a thread parar bastava sair do run, resumindo valeu pela dica não ensinou apenas ao dono do tópico mas a mim também
pedroroxd
Hehe…
Mas essa resposta foi a do primeiro tópico…
A minha segunda dúvida ainda não foi saciada
ViniGodoy
Tem duas formas.
Você pode chamar interrupt na sua thread, para que ela pare, e então recriar a thread.
Você pode criar algum método no seu Runnable, para setar a variável novamente para 31.
pedroroxd
Mas como que eu vou dar interrupt na thread quando clicar no botão “CANCELAR” sendo que eu crio ela quando clico no botão “INICIAR”?
ViniGodoy
Transforme a thread num atributo da sua classe:
publicclassSuaClasse{privateThreadclockThread=null;privatevoidjButton1ActionPerformed(java.awt.event.ActionEventevt){if(clockThread!=null)//Já foi iniciada?return;clockThread=newThread(newClockRunnable(),"Clock thread");clockThread.setDaemon(true);clockThread.start();}privatevoidjButton2ActionPerformed(java.awt.event.ActionEventevt){if(clockThread==null)//Nunca foi iniciada?return;clockThread.interrupt();clockThread=null;}}
É uma bota também trocar o seu while (true) para while (!Thread.isInterrupted())
pedroroxd
Ops…
Tinha falado coisa errada…
Calmae que eu vo testar