ja pensou em fazer um for que vai diminuindo o valor dessa variável a cada loop?
deve haver alguma classe utilitária pra isso, mas não conheço hehehe…
a idéia básica é: public static void main(String[] args){
int segundos = 10;
try{
for (int i = segundos; i > 0; i--){
System.out.println(i + " segundos");
Thread.sleep(1000); // 1 segundo
}
System.out.println("Terminei!");
} catch (InterruptedException e){
System.out.println("Interromperam meu sono!");
}
}Sei que dizem que usar Thread.sleep() é péssimo, mas foi o jeito mais simples que encontrei pra criar um exemplo
I
InicianteJavaHenriqu
Fiz um exemplo:
importjava.text.DateFormat;importjava.text.SimpleDateFormat;importjava.util.Calendar;importjava.util.Timer;importjava.util.TimerTask;/** * * @author Henrique Ferreira da Silva */publicclassCronometro{privateTimercronometro;privateDateFormatformato=newSimpleDateFormat("HH:mm:ss");privateCalendarcalendario=Calendar.getInstance();privatefinalbytecontagem;publicstaticfinalbytePROGRESSIVA=1;publicstaticfinalbyteREGRESSIVA=-1;publicCronometro(intano,intmes,intdia,inthoras,intminutos,intsegundos,bytetipoContagem){this.cronometro=newTimer();calendario.set(ano,mes,dia,horas,minutos,segundos);this.contagem=tipoContagem;}publicvoidcronometro(){TimerTasktarefa=newTimerTask(){@Overridepublicvoidrun(){System.out.println(getTime());}};cronometro.scheduleAtFixedRate(tarefa,0,1000);this.cronometro=null;}publicStringgetTime(){calendario.add(Calendar.SECOND,contagem);returnformato.format(calendario.getTime());}publicstaticvoidmain(String[]args){Cronometrocontagem=newCronometro(0,0,0,10,30,5,REGRESSIVA);contagem.cronometro();}}
Note que no construtor da classe você pode passar como parâmetro: o ano, mês, dia, horas, minutos e segundos para iniciar o timer e ainda escolher se deseja contagem regressiva ou progressiva.
No exemplo, o cronometro inicia em 10 horas, 30 minutos e 5 segundos.
:thumbup:
B
ByIvo
segue solução
B
ByIvo
Amigo, esses dois códigos acima funcionam, mas pelo que eu entendi da sua necessidade, esse timer terá de roda em paralelo com uma outra aplicação certo?
O melhor é criar uma Thread.
Observe o código:
Talvez tenha algum erro de sintaxe, mas basicamente é isso:
classTimer{publicstaticvoidmain(String[]argumentos){// instancia uma thread, passando como construtor uma implementação de runnable.//runnable é uma interface, que implementa o metodo run, quando a thread é statada(.start();), o método run() é executado.// o parâmetro do construtor da classe ExecucaoDoThread é o número que vai ser decrescido até 0Threadt=newThread(newExecucaoDoThread(10));t.start();}classExecucaoDoThreadimplementsRunnable{privateintnum;publicExecucaoDoThread(intnum){//o num vai receber o numero que vai ser descrescido até 0;this.num=num;}@Overridepublicvoidrun(){//aqui vai o código que será executado pela thread//cria um jframe e seta seu tamanhoJFrameframe=newJFrame();frame.setSize(200,200);//cria uma jlabel, adiciona no frame e chama o metodo do, passando essa label como parametroJLabellabel=newJLabel();frame.add(label);go(label);}publicvoidgo(JLabellabel){//faz um for que vai de num até 0, no passo -1.//cada loop do for, troca o valor do label por i, e espera 1 segundo ( utilizando o metodo static Thread.sleep(); e passando o tempo em millis que deverá aguardarfor(inti=num;i>=0;i--){try{label.setText(i+"");Thread.sleep(1000);}catch(Exceptionex){}}}}}
Acho que vai funcionar…
qualquer dúvida, procure tutoriais sobre Threads ou me mande uma mensagem que eu volto a explicar.
B
Bruno_M_Gasparotto
digaoneves:
ja pensou em fazer um for que vai diminuindo o valor dessa variável a cada loop?
deve haver alguma classe utilitária pra isso, mas não conheço hehehe…
a idéia básica é: public static void main(String[] args){
int segundos = 10;
try{
for (int i = segundos; i > 0; i--){
System.out.println(i + " segundos");
Thread.sleep(1000); // 1 segundo
}
System.out.println("Terminei!");
} catch (InterruptedException e){
System.out.println("Interromperam meu sono!");
}
}Sei que dizem que usar Thread.sleep() é péssimo, mas foi o jeito mais simples que encontrei pra criar um exemplo :)
ByIvo:
Amigo, esses dois códigos acima funcionam, mas pelo que eu entendi da sua necessidade, esse timer terá de roda em paralelo com uma outra aplicação certo?
O melhor é criar uma Thread.
Observe o código:
Talvez tenha algum erro de sintaxe, mas basicamente é isso:
classTimer{publicstaticvoidmain(String[]argumentos){// instancia uma thread, passando como construtor uma implementação de runnable.//runnable é uma interface, que implementa o metodo run, quando a thread é statada(.start();), o método run() é executado.// o parâmetro do construtor da classe ExecucaoDoThread é o número que vai ser decrescido até 0Threadt=newThread(newExecucaoDoThread(10));t.start();}classExecucaoDoThreadimplementsRunnable{privateintnum;publicExecucaoDoThread(intnum){//o num vai receber o numero que vai ser descrescido até 0;this.num=num;}@Overridepublicvoidrun(){//aqui vai o código que será executado pela thread//cria um jframe e seta seu tamanhoJFrameframe=newJFrame();frame.setSize(200,200);//cria uma jlabel, adiciona no frame e chama o metodo do, passando essa label como parametroJLabellabel=newJLabel();frame.add(label);go(label);}publicvoidgo(JLabellabel){//faz um for que vai de num até 0, no passo -1.//cada loop do for, troca o valor do label por i, e espera 1 segundo ( utilizando o metodo static Thread.sleep(); e passando o tempo em millis que deverá aguardarfor(inti=num;i>=0;i--){try{label.setText(i+"");Thread.sleep(1000);}catch(Exceptionex){}}}}}
Acho que vai funcionar…
qualquer dúvida, procure tutoriais sobre Threads ou me mande uma mensagem que eu volto a explicar.
Então, esse timer roda em paralelo sim, é uma tabela com diversas linhas, onde cada uma levará um contador próprio, e um dos horários para esse cálculo será o horário atual.
Estava verificando essa solução utilizando threads, porém não seria até mais seguro utilizar um servidor que seta o relógios dos computadores (para o usuário não mexer) e usar o horário do pc como base pra cada cálculo?
B
Bruno_M_Gasparotto
InicianteJavaHenrique:
Fiz um exemplo:
importjava.text.DateFormat;importjava.text.SimpleDateFormat;importjava.util.Calendar;importjava.util.Timer;importjava.util.TimerTask;/** * * @author Henrique Ferreira da Silva */publicclassCronometro{privateTimercronometro;privateDateFormatformato=newSimpleDateFormat("HH:mm:ss");privateCalendarcalendario=Calendar.getInstance();privatefinalbytecontagem;publicstaticfinalbytePROGRESSIVA=1;publicstaticfinalbyteREGRESSIVA=-1;publicCronometro(intano,intmes,intdia,inthoras,intminutos,intsegundos,bytetipoContagem){this.cronometro=newTimer();calendario.set(ano,mes,dia,horas,minutos,segundos);this.contagem=tipoContagem;}publicvoidcronometro(){TimerTasktarefa=newTimerTask(){@Overridepublicvoidrun(){System.out.println(getTime());}};cronometro.scheduleAtFixedRate(tarefa,0,1000);this.cronometro=null;}publicStringgetTime(){calendario.add(Calendar.SECOND,contagem);returnformato.format(calendario.getTime());}publicstaticvoidmain(String[]args){Cronometrocontagem=newCronometro(0,0,0,10,30,5,REGRESSIVA);contagem.cronometro();}}
Note que no construtor da classe você pode passar como parâmetro: o ano, mês, dia, horas, minutos e segundos para iniciar o timer e ainda escolher se deseja contagem regressiva ou progressiva.
No exemplo, o cronometro inicia em 10 horas, 30 minutos e 5 segundos.
:thumbup:
neste caso:
ele recebe data/hora do sistema como se fosse um Date data = new Date(); ?
Agradeço a resposta de todos e desculpem a demora para responder, me enrolei no resto do dia e fiquei sem acesso ao pc em casa.
B
ByIvo
pois é, Calendar cal = Calendar.getInstance(); e Date dat = new Date() pegam a hora do sistema do usuario.
agora entendi, pena que não vou poder testar agora, to envolvido com outra etapa do processo que é bem mais urgente, mas logo mais dou um feedback aqui de como foi implementado.
Valeu mesmo a ajuda
B
Bruno_M_Gasparotto1 like
Consegui implementar o que eu queria, usando Timer e TimerTask, só acho que preciso dar uma melhorada na passagem de parâmetro pro construtor.
Espero que funcione, pois na aplicação que possui o método main eu soh preciso instanciar e chamar o método calculaTempo().