Cronometro

5 respostas
P

Tenho que exibir um cronometro na minha aplicação.

Eh mais ou menos aquele cronometro do provedor de uma internet discada.

Ao iniciar dispara-se o cronometro e o usuario pode pausar através de um click num botão.

Por favor me ajude!!!

5 Respostas

B

Olá Patty, tudo bem?

Fiz uma vez um cronômetro usando threads e baseando todo a lógica na contagem dos segundos. Aqui está a Thread que fiz:
Runnable runnable = new Runnable() {    
        public void run() {
            if ( executar ) {
                while ( executar ) {
                    lblSegundos.setText( String.valueOf( segundos ) );
                    
                    try {
                        t.sleep(1000);
                    } catch (InterruptedException ex) {
                        ex.printStackTrace();
                    }
                    segundos =  segundos + 1;
                    
                    if (segundos == 60) {
                        segundos = 0;
                        minutos = minutos + 1;
                    }
                    lblMinutos.setText( String.valueOf( minutos ) ) ;
                    
                }
            } else {
                segundos = 1;
                minutos = 0;
                return;
            }
        }
    };
É claro que você precisará declarar as seguintes variáveis em seu arquivo .java:
Thread t = new Thread(runnable);
boolean executar = false;
int
        minutos = 1,
        segundos = 1;
Na ação do botão (porque usei uma interface gráfica) fiz da seguinte maneira:
private void jButton1ActionPerformed(java.awt.event.ActionEvent evt) {                                         
        if (!executar || t.getState().toString() != "TIMED_WAITING" ) {
            segundos = 1;
            minutos = 0;
            executar = true;
            t.start();
            System.out.println( t.getState() );
        } else if (!executar || t.getState().toString() == "TIMED_WAITING" ) {
            executar = false;
            System.out.println( t.getState() );
        }
    }
Lembro que tinha tentado fazer o botão iniciar e dar pausa no cronômetro, mas a pausa eu não consegui implementar. Mas você, com esse material inicial e seu talento, certamente conseguirá fazê-lo. Apenas lembre-se de divulgar aqui como você conseguiu.
G

Olá Patty,

eu fiz um sw uns tempos atras que tinha um cronometro com as mesmas funcionalidades que vc pediu (pausar/continuar) contudo eu ainda acelerava ele ou reduzia a velocidade dos ciclos.

Resolvi isso através de um Timer e não Thread.

Experimenta dar implementar em Thread, caso não consiga me avise que te mando um exemplo em Timer.

flw

K

Thread.sleep(1000) é aproximadamente 1 segundo…

Se voce estiver por exemplo abrindo um outro programa que esteja usando muito o processador esse 1 segundo demora mais de um segundo.

Voce tem que fazer algo baseado no relogio interno, mas tem outro problema…

SE ALGUEM MUDAR A HORA DA MAQUINA.

vc precisa de muita precisao neste contador?

P

Tenho um exemplo que utilizei recentemente:

import java.awt.event.ActionListener;
import java.text.DateFormat;
import java.text.SimpleDateFormat;
import java.util.Calendar;

import javax.swing.Timer;

/**
* Objetivo: Controlar o timer 
* Data: 07/08/2006
* @author Fabio Pedrosa
* @version 1.0
*/
public final class TimerCall {

	/** Constantes */
	private static final int TIME = 1000;
	/** Atributos */
	private static DateFormat dateFormat = null;
	private static Calendar calendar = null;
	private static Timer timer = null;

	static {
		dateFormat = new SimpleDateFormat("HH:mm:ss");
		calendar = Calendar.getInstance();
		calendar.set(Calendar.MILLISECOND, 0);
        calendar.set(Calendar.SECOND, 0);
        calendar.set(Calendar.MINUTE, 0);
        calendar.set(Calendar.HOUR_OF_DAY, 0);
	}
	
	/** Construtor */
	private TimerCall() {}

	/**
	* Objetivo: Iniciar o timer da ligação 
	* Data: 07/08/2006
	* @param action ActionListener
	*/
	public static void startTimer(ActionListener action) {
		timer = new Timer(TIME, action);
		timer.start();
	}
	
	/**
	* Objetivo: Parar o timer da ligação 
	* Data: 07/08/2006
	*/
	public static void stopTimer() {
		System.out.println("stopTime()");
		if(timer!=null){
			if(timer.isRunning()) {
				timer.stop();
				resetTimer();
			}
		}	
	}
	
	public static boolean isTimerRunning(){
		boolean flagTimer = false;
		if(timer!=null){
			if(timer.isRunning()){
				flagTimer = true;
			}
		}	
		return flagTimer;
	}
	
	/**
	* Objetivo: Zerar o timer da ligação 
	* Data: 07/08/2006
	*/
	protected static void resetTimer() {
		calendar.set(Calendar.MILLISECOND, 0);
        calendar.set(Calendar.SECOND, 0);
        calendar.set(Calendar.MINUTE, 0);
        calendar.set(Calendar.HOUR_OF_DAY, 0);
        timer = null;
	}

   /**
   * Objetivo: Montar o timer 
   * Data: 07/08/2006
   * @return String
   */
	public static String getTime() {
		calendar.add(Calendar.SECOND, 1);
		if(timer != null) {
		    return dateFormat.format(calendar.getTime());
		}
		return "";
    }
}
P

Eu tentei tudo que vcs me indicaram mas não funcionou…
Então, se tiverem mais alguma outra sugestão por favor coloquem aqui.

:slight_smile:

Criado 30 de novembro de 2006
Ultima resposta 2 de dez. de 2006
Respostas 5
Participantes 5