Cronometro

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!!!

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:

[code]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;
        }
    }
};[/code]

É 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.

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

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?

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 "";
    }
}

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: