Seguinte , eu recebo de meu servidor um numero int e eu devo
pegar esse numero e faze uma espécie de contagem regressiva
como se fosse em minutos por exemplo eu recebo um numero 40 do meu servidor
e devo ir regredindo como se fossem 40 minutos aí quando zerar eu fecharia o programa.
Eu ja ouvi algo sobre uma classe do java que faz isso mas nao lembro o nome, se alguem
puder so da uma dica agradeço.
Cara valeu pela dica mas nao sei se isso vai pode me ajuda, ou eu nao entendi bem
o funcionamento dessa classe.
meu problema eh q eu tenho que regredir um tempo etende dai apos esse tempo terminar meu
frame tem que ser fechado, e pelo que eu entendi esse timer recebe como parametro o tempo e executa
uma funçao quando chega nesse tempo, eu nao sei se funcionaria pq eu tenho que fica atualizando constantemente
um textfield que mostra o tempo regredindo.
Você precisará utilizar dois TimerTask, um que será o contador, responsável por exibir o valor em um JTextField e outro que fechará o JFrame.
Dá uma olhada neste exemplo:
Classe ExemploTimer
public class ExemploTimer {
public static void main (String[] args){
JFrame jFrame = new JFrame();
JTextField txtContador = new JTextField();
JPanel jPanel = new JPanel();
long tempoTotal = 5000;//5 segundos para fechar o frame
//Responsável pelo contador
TimerContador contador = new TimerContador();
//Responsável pelo Fechamento o JFrame
TimerFechaFrame fechaFrame = new TimerFechaFrame();
txtContador.setText(String.valueOf(tempoTotal));
jPanel.setLayout(new GridLayout(1,2));
jPanel.add(new JLabel("Contador Timer"));
jPanel.add(txtContador);
jFrame.setSize(800, 100);
jFrame.add(jPanel);
jFrame.setVisible(true);
//Definindo componente e o tempo que fechará o Frame, para que o
//contador possa saber de quantos milisegundos começar
contador.setComponent(txtContador);
contador.setTempo(tempoTotal);
//Definindo o JFrame que será fechado
fechaFrame.setFrame(jFrame);
/*Aqui você define o TimerTask, tempo da primeira execução
o tempo de intervalo entre as execuções
isto indica que o JTextField será atualizado a cada segundo*/
new Timer().schedule(contador, 1000, 1000);
//Aqui o tempo para fechar o Frame
new Timer().schedule(fechaFrame, tempoTotal);
}
}
A classe TimerContador é o TimerTask responsável por atualizar o JTextField a cada segundo
Classe TimerContador
public class TimerContador extends TimerTask{
//Componente que exibirá o tempo restante
private JTextField component;
private long tempo;
//Aqui você define qual JTextField receberá o tempo restante
public void setComponent(JTextField component) {
this.component = component;
}
//Aqui você informa o tempo que passou no Timer que fechará o frame
//lembrando que long = milisegundo
public void setTempo(long tempo){
this.tempo = tempo;
}
@Override
public void run() {
//Se o timer estiver vazio, populará o contador com o valor inicial
if(component.getText() == null ||
component.getText().length() == 0){
component.setText(String.valueOf(tempo));
}
//Caso contrário, vai subtraindo 1000 (1 segundo) do tempo restante do contator
else{
long tempoRestante = Long.valueOf(component.getText()).longValue();
component.setText(String.valueOf(tempoRestante - 1000));
}
}
}
A classe TimerFechaFrame é o TimerTask responsável por fechar o JFrame
Classe TimerFechaFrame
public class TimerFechaFrame extends TimerTask {
//Frame que será fechado
public JFrame frame;
//Define o JFrame que serpa fechado
public void setFrame(JFrame frame) {
this.frame = frame;
}
@Override
public void run() {
//Fecha o JFrame
frame.setVisible(false);
//Para finalizar todo o sistema você precisa
//utilizar o método exit do System
//System.exit(0);
}
}
Qualquer coisa eu anexei classes que usei p/ o teste.
Espero ter ajudado.
Abraços
Amigo, obrigado mesmo era bem isso que eu tava precisando
so tem um probleminha na parte de fechar o frame
ele ta zerando o cronometro e ao invez de feichar ele continua contando
numeros negativos, nao consegui encontra o problema!
abraço
No TimerContador é só você colocar mais um if dentro do else para checar se já acabou o tempo, desta forma:
@Override
public void run() {
//Se o timer estiver vazio, populará o contador com o valor inicial
if(component.getText() == null ||
component.getText().length() == 0){
component.setText(String.valueOf(tempo));
}
//Caso contrário, vai subtraindo 1000 (1 segundo) do tempo restante do contator
else{
long tempoRestante = Long.valueOf(component.getText()).longValue();
//Aqui você checa se já acabou o tempo para parar o timer
if((tempoRestante - 1000) <= 0){
cancel();
}
else{
component.setText(String.valueOf(tempoRestante - 1000));
}
}
}
Cara valeu quanto a parte de parar o cronometro tranquilo
mas eu me refiro a parte de feichar o frame
//Aqui o tempo para fechar o Frame
new Timer().schedule(fechaFrame, tempoTotal);
ele deveria contar ate o valor (tempoTotal) e chamar o metodo fechaFrame neh??
só que ele simplesmente para o cronometro e fica lá como se nao estivesse chamando o metodo
[quote=c1c3r00]Cara valeu quanto a parte de parar o cronometro tranquilo
mas eu me refiro a parte de feichar o frame
//Aqui o tempo para fechar o Frame
new Timer().schedule(fechaFrame, tempoTotal);
ele deveria contar ate o valor (tempoTotal) e chamar o metodo fechaFrame neh??
só que ele simplesmente para o cronometro e fica lá como se nao estivesse chamando o metodo
[/quote]
Estranho…
Vc viu se ele lançou alguma Exception?
Vc definiu o frame q será fechado com o setFrame?
//Definindo o JFrame que será fechado
fechaFrame.setFrame(jFrame);
O tempo total é o tempo inicial do cronômetro?
Abraços
Olha passei o frame certinho que deverá ser fechado
bom ele nao gerou nenhum erro
simplesmente para no 1. e nao faz nada
bom eu nao sei bem a funcionalidade da timetask seria de chamar a função
fecha frame quando o tempo chegar ao (tempoTotal) neh
por exemplo eu estou definindo q o tempoTotal eh o tempo
que o usuario tem que quando ele zerar o frame fecha
minha logica ta correta?