Relógio/data funcionando

10 respostas
LG11

Dúvida simples que ainda não foi perguntada ou mencionado a questão no forum.

Estou usando a classe Calendar para obter a data e a hora do sistema do computador para uma agenda que estou construindo.
Minha dúvida é o seguinte:
Para eu fazer com que a data (isto inclui o horario atual), seja atualizada a cada segundo… Eu a classe Calendar tem alguma forma de se fazer isso !? ( porque eu não achei na API ) Ou eu teria que usar uma thread para fazer o relógio funcionar !?

Obrigado.

.LG.

10 Respostas

Marlon_Meneses

eu uso thread pra fazer isso!

LG11

sim, usar ela é uma boa, mas é a unica opção!?

porque é como dizem : " Se a roda já está inventada, não tente reinventa-la. " :roll:

Alias… Aonde eu posso consigo um bom exemplo de uma thread funcionando !?

Marlon_Meneses
import java.awt.*;
import java.text.SimpleDateFormat;
import java.util.Date;
import javax.swing.*;

public class Relogio extends JFrame {

    public static JLabel jl;

    public Relogio() {
        jl = new JLabel();
        jl.setHorizontalAlignment(SwingConstants.CENTER);
        add(jl);
        setSize(100, 100);
        setVisible(true);
    }

    public static void Hora() {
        SimpleDateFormat sdf = new SimpleDateFormat("k:MM:ss");
        Thread t = new Thread();

        try {
            while (true) {
                t.sleep(1000);
                jl.setText(sdf.format(new Date()));
            }
        } catch (Exception e) {

        }
    }

    public static void main(String args[]) {
        Relogio relogio = new Relogio();
        relogio.setDefaultCloseOperation(EXIT_ON_CLOSE);
        Hora();
    }
}
LG11

Agradeço.

Me ajudou muito.

LG11

falei cedo :roll:

ao tentar adicionar isso ao meu JFrame...
try {   
    while (true) {   
        Thread.sleep(1000);   
        dataHorario.setText(sdf.format(new Date()));   
    }   
} catch (Exception e) {   
    e.printStackTrace();
}

/* Legenda:
dataHorario  =  JLabel
sdf          =  SimpleDateFormat
*/
O meu programa não emite erro nenhum, mas também não fica visivel. Consta que está rodando mas não aparece nada... o programa não aparece. :cry:

"Sim... o meu JFrame tem o comando setVisible() para ficar visivel."

Alguma coisa nesse try está fazendo com que o meu frame não apareça. Se eu removo o try do codigo... o meu programa aparece.
Help !?

Marlon_Meneses

isso pq ele executa a thread e como eh um loop entao nunca vai alcançar a parte onde esta configurada seu JFrame!
vc tem q fazer um metodo e depois da instanciacao do seu xamado vc xama o metodo
entendeu?

LG11
Marlon Meneses:
isso pq ele executa a thread e como eh um loop entao nunca vai alcançar a parte onde esta configurada seu JFrame! vc tem q fazer um metodo e depois da instanciacao do seu xamado vc xama o metodo entendeu?
você quer dizer assim:
public Janela(){
    Hora();
}

public static void Hora(){
    try {     
        while (true) {     
            Thread.sleep(1000);     
            dataHorario.setText(sdf.format(new Date()));     
        }     
    } catch (Exception e) {     
        e.printStackTrace();   
    }
}
Porque dessa forma eu tentei e não deu certo. Se não for... então não entendi o que você quis dizer. (este é o jeito que o Marlon mostrou... mas não funcionou. pela lógica está correto, mas não deu.
ivo_costa

Assim tá ok:

public class Teste extends JFrame {

    public static JLabel jl;

    public Teste() {
        jl = new JLabel();
        jl.setHorizontalAlignment(SwingConstants.CENTER);
        add(jl);
        setSize(100, 100);
        setVisible(true);
        new thread().run();
    }

    public static void main(String args[]) {
        Teste relogio = new Teste();
        relogio.setDefaultCloseOperation(EXIT_ON_CLOSE);
    }
    
    class thread extends Thread{
    	public void run(){
    		SimpleDateFormat sdf = new SimpleDateFormat("k:MM:ss");
            try {
                while (true) {
                    sleep(1000);
                    jl.setText(sdf.format(new Date()));
                }
            } catch (Exception e) {

            }
    	}
    }
}
LG11

o mais estranho eh que no meu programa… da sua forma não funciona. mas o seu codigo executa normalmente.

Veja bem:
1º Arquivo:

public class Main {

    /**
     * @param args the command line arguments
     */
    public static void main(String[] args) {
        // TODO code application logic here
        Janela A = new Janela();
        A.setSize(595, 350);
        A.setVisible(true);
        A.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        A.setLocation(200, 200);
    }
}

Segundo Arquivo:

public class Janela extends JFrame{

    public Janela(){

    dataHorario = new JLabel();   
    dataHorario.setHorizontalAlignment(SwingConstants.CENTER);   
    add(dataHorario);
    new thread().run();    
    }
    
    class thread extends Thread{   
        @Override
        public void run(){   
            SimpleDateFormat sdf = new SimpleDateFormat("k:MM:ss");   
            try {   
                while (true) {   
                    sleep(1000);   
                    dataHorario.setText(sdf.format(new Date()));   
                }   
            } catch (Exception e) {   

            }   
        }   
    }
}

e não funfa.
É claro que meu codigo está bem mais elaborado que isso, mas nada que comprometa a execução do meu programa, pois sem o codigo do relógio… ele executa sem nenhum erro.

aaa sim…
Também tentei mudar isso:

new thread().run();

Por isso:

thread t = new thread(); t.run();
E adivinha so!? Também não funcionou.

A unica diferença que vi no seu codigo para o meu é que o seu eh todo feito em um arquivo so. eu ja divido o codigo em 2.
Meu unico problema é que meu programa já está com um codigo meio que grande para fazer uma modificação tão drastica.
Há uma maneira de fazer isso dentro das condições do meu código!?

ivo_costa

Pra funcionar desse seu jeito vc tem que passar como parametro no construtor os valores que deseja que a janela assuma, eu acho que não tem jeito de mudar depois chamando os métodos pelo main.

public class Teste {

	public static void main(String[] args) {
		Janela A = new Janela(595, 350, 200, 200);
	}
}
import java.text.SimpleDateFormat;
import java.util.Date;

import javax.swing.JFrame;
import javax.swing.JLabel;
import javax.swing.SwingConstants;

public class Janela extends JFrame{

    JLabel dataHorario;
	
	public Janela(int x, int y, int a, int b){

		dataHorario = new JLabel();   
		dataHorario.setHorizontalAlignment(SwingConstants.CENTER);   
		add(dataHorario);
		setSize(x, y);
		setLocation(a, b);
		setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
		setVisible(true);
		new thread().run();
    }
	
	class thread extends Thread{   
        @Override
        public void run(){   
            SimpleDateFormat sdf = new SimpleDateFormat("k:MM:ss");   
            try {   
                while (true) {   
                    sleep(1000);   
                    dataHorario.setText(sdf.format(new Date()));   
                }   
            } catch (Exception e) {   

            }   
        }   
    }
}

ps.: Se tu colocar o setDefaultCloseOperation no main, quando vc clicar no X ao invés de fechar a janela ela vai se esconder, ou seja se tu executar 100 vezes o programa vai te 100 janelas rodando em backGround. Executa o gerenciador de tarefas pra ve.

Criado 7 de abril de 2008
Ultima resposta 14 de abr. de 2008
Respostas 10
Participantes 3