Como colocar um relógio no sistema? (RESOLVIDO)

17 respostas
Leandro_Vecchi

Olá pessoal, estou fazendo uma aplicação bem simples, e gostaria que nela tivesse um relógio, não precisa ser necesariamente um relógio desenhado eheh, mas pode ser apenas o dia, mes, ano, hora, minuto e segundo (setados em um field ou label), mas eu gostaria que ficasse marcando a hora certinha, conforme a hora do sistema. pensei em fazer com thread mas não sei se seria somente isso. alguem sabe alguma coisa a respeito disso?
obrigado.

17 Respostas

ajfilho

Bom, vou te mostrar como faço para rodar aqui nos meu programas. Deve ter jeito melhor de fazer, mas esse funciona:

Primeiro crio uma classe AtualizadorHorario

import java.text.SimpleDateFormat;
import java.util.Date;
import javax.swing.JLabel;
/**
 *
 * @author AJFILHO
 */
public class AtualizadorHorario extends Thread {

    private JLabel hr;
    private boolean mostrarData;

    public AtualizadorHorario(JLabel hora) {
        this.hr = hora;
    }

    public void mostrarData(boolean mostrar) {
        if (mostrar) {
            this.mostrarData = true;
        } else {
            this.mostrarData = false;
        }
    }

    @Override
    public void run() {
        try {
            while (true) {
                Date d = new Date();
                StringBuffer data = new StringBuffer();
                if (mostrarData) {
                    SimpleDateFormat sdfData = new SimpleDateFormat("dd.MM.yyyy");
                    data.append(sdfData.format(d));
                    data.append(" - ");
                }
                SimpleDateFormat sdf = new SimpleDateFormat("HH:mm:ss");
                this.hr.setText(data.toString() + sdf.format(d));
                Thread.sleep(1000);
                this.hr.revalidate();
            }
        } catch (InterruptedException ex) {
            System.out.println("Problema na atualização da data/hora");
            ex.printStackTrace();
        }
    }
}

Depois dentro da classe que terão os componentes swings eu crio um metodo para mostrar essa hora:

public void mostrarHora() {
        AtualizadorHorario ah = new AtualizadorHorario(labelHora);
        ah.mostrarData(true);
        Thread thHora = ah;
        thHora.start();
    }

Finalmente chamo esse método dentro do construtor da classe e rodo!

Abraços!

M

Se quiser uma sugestão, é preferível implementar Runnable a estender Thread. Mas parabéns pelo programa.

ajfilho

Realmente eu já tinha lido sobre isso, mas esse código é meio antigo.

Obrigado mesmo assim pelo conselho!

Abraços!

Leandro_Vecchi
ajfilho:
Bom, vou te mostrar como faço para rodar aqui nos meu programas. Deve ter jeito melhor de fazer, mas esse funciona:

Primeiro crio uma classe AtualizadorHorario

import java.text.SimpleDateFormat;
import java.util.Date;
import javax.swing.JLabel;
/**
 *
 * @author AJFILHO
 */
public class AtualizadorHorario extends Thread {

    private JLabel hr;
    private boolean mostrarData;

    public AtualizadorHorario(JLabel hora) {
        this.hr = hora;
    }

    public void mostrarData(boolean mostrar) {
        if (mostrar) {
            this.mostrarData = true;
        } else {
            this.mostrarData = false;
        }
    }

    @Override
    public void run() {
        try {
            while (true) {
                Date d = new Date();
                StringBuffer data = new StringBuffer();
                if (mostrarData) {
                    SimpleDateFormat sdfData = new SimpleDateFormat("dd.MM.yyyy");
                    data.append(sdfData.format(d));
                    data.append(" - ");
                }
                SimpleDateFormat sdf = new SimpleDateFormat("HH:mm:ss");
                this.hr.setText(data.toString() + sdf.format(d));
                Thread.sleep(1000);
                this.hr.revalidate();
            }
        } catch (InterruptedException ex) {
            System.out.println("Problema na atualização da data/hora");
            ex.printStackTrace();
        }
    }
}

Depois dentro da classe que terão os componentes swings eu crio um metodo para mostrar essa hora:

public void mostrarHora() {
        AtualizadorHorario ah = new AtualizadorHorario(labelHora);
        ah.mostrarData(true);
        Thread thHora = ah;
        thHora.start();
    }

Finalmente chamo esse método dentro do construtor da classe e rodo!

Abraços!

Aew. vlww pelas dicas, etendi com faz, mas ta dando um errinho:

Exception in thread "Thread-2" java.lang.NullPointerException
at util.AtualizadorHorario.run(AtualizadorHorario.java:40)

mas vou corrigir ele, vou ver qual é hehe
vlww!

Leandro_Vecchi

é, ainda ta dando erro hehe :

Exception in thread “Thread-2” java.lang.NullPointerException
at util.AtualizadorHorario.run(AtualizadorHorario.java:40)

ajfilho

Dá um refresh ou um clean no teu projeto e rode novamente!.

Aqui roda tranquilamente!

Posta como tu estás chamando o método para mostrar a hora!

Abraços!

Leandro_Vecchi

ajfilho:
Dá um refresh ou um clean no teu projeto e rode novamente!.

Aqui roda tranquilamente!

Posta como tu estás chamando o método para mostrar a hora!

Abraços!


Vlw Ajfilho!!
deu certo, o problema era o seguinte, eu tinha um método que era executado no construtor, daí eu chamei o AtualizadorHorario dentro desse oturo método, e não diretamente no construtor, daí deu erro, mas quando eu chamei o AtualizadorHorario dentro do contrutor direto, deu certo!!!
eheh
Obrigado! era isso mesmo que eu queria!!
vlw!

ajfilho

Beleza parceiro.

Precisando, estamos aí!

Abraços!

Marky.Vasconcelos

Talvez voce crio o atualizador antes de criar o label.

Leandro_Vecchi

Eu tinha chamado o método dentro de outro método, e não podia, ehhee , tinha que chamar direto do construtor :smiley:
agora deu certo ehehhe

mas valeu !!

A

Prezado

Tentei implementar o referido código em uma agenda que estrou fazendo, e a hora não saiu no jtextfield. Eu teria que criar um construtor Atualizadorhorario. Teria mais alguma dica? Gostaria que minha data aparecesse e ela não aparecesse.

R

bem deveria sair num jlabel.

para mim funcionou bem, segue o tópico que pretendo aplicar.

B

Bom dia!

atualizando o tópico.

Criando a classe:

package br.teste.domain;

import java.text.SimpleDateFormat;
import java.util.Date;
import javax.swing.JTextField;

public class AtualizadorHorario {

	public static void start(final JTextField textFieldHorario){
		Thread atualizaHora = new Thread(new Runnable() {
			
			@Override
			public void run() {
				try {
					while (true) {
						Date date = new Date();
						StringBuffer data = new StringBuffer();
						
						SimpleDateFormat sdf = new SimpleDateFormat("HH:mm:ss"); // Para Atualizar a DATA so mudar para o formato dd/MM/yyyy
						textFieldHorario.setText(data.toString() + sdf.format(date));
						Thread.sleep(1000);
						textFieldHorario.revalidate();
					}
				} catch (InterruptedException ex) {
					ex.printStackTrace();
				}
				
			}
		});
		atualizaHora.start();
	}
}

depois dentro da Classe onde terá os componentes Swing(JFrame por exemplo):

AtualizadorHorario.start(textFieldHorario);
A

Fiz um pequeno exemplo aqui… espero que ajude …

class MyTime extends Observable implements Runnable { 
    
    private String horas; 
    
    public MyTime(Observer obs) { 
        this.addObserver(obs);
    } 
    
    @Override
    public void notifyObservers() { 
        super.setChanged();
        super.notifyObservers();
    }

    @Override
    public void run() { 
        while(true){
            this.horas = new SimpleDateFormat("dd/MM/yyyy - HH:mm:ss").format(Calendar.getInstance().getTime());
            this.notifyObservers();
        }        
    }  

    public String getHoras() {
        return horas;
    }  
}
class MyJFrame extends JFrame implements Observer { 
    
    private JLabel label; 
    
    public MyJFrame() { 
        init();
    } 
    
    private void init() { 
        setTitle("Relógio");
        setSize(255, 80);
        setLocationRelativeTo(null);
        setResizable(false); 
        setDefaultCloseOperation(DISPOSE_ON_CLOSE);        
        configComponent();
        startRelogio();
    } 
    
    private void configComponent() {         
        label = new JLabel();
        label.setHorizontalAlignment(SwingConstants.CENTER);
        label.setFont(new Font("Tahoma", 1, 20));       
        this.getContentPane().add(label, BorderLayout.CENTER);        
    }
    
    private void startRelogio() { 
        new Thread(new MyTime(this)).start();        
    }

    @Override
    public void update(Observable o, Object arg) { 
        MyTime time = (MyTime)o;  
        this.label.setText(time.getHoras());
    } 
    
    public static void main(String[] args) {        
        EventQueue.invokeLater(new Runnable() {
            @Override
            public void run(){                
                new MyJFrame().setVisible(true);
            }
        });
    }   
}
monrrah
bucha:
Bom dia!

atualizando o tópico.

Criando a classe:

package br.teste.domain;

import java.text.SimpleDateFormat;
import java.util.Date;
import javax.swing.JTextField;

public class AtualizadorHorario {

	public static void start(final JTextField textFieldHorario){
		Thread atualizaHora = new Thread(new Runnable() {
			
			@Override
			public void run() {
				try {
					while (true) {
						Date date = new Date();
						StringBuffer data = new StringBuffer();
						
						SimpleDateFormat sdf = new SimpleDateFormat("HH:mm:ss"); // Para Atualizar a DATA so mudar para o formato dd/MM/yyyy
						textFieldHorario.setText(data.toString() + sdf.format(date));
						Thread.sleep(1000);
						textFieldHorario.revalidate();
					}
				} catch (InterruptedException ex) {
					ex.printStackTrace();
				}
				
			}
		});
		atualizaHora.start();
	}
}

depois dentro da Classe onde terá os componentes Swing(JFrame por exemplo):

AtualizadorHorario.start(textFieldHorario);

O MUNDO TEM QUE VER ESTE CÓDIGO ! PROCUREI POR 2 DIAS, ESTUDEI DEZENAS DE EXEMPLOS, + SÓ ESSE RESOLVEU ! VLW CARA !!!

B

Que bom ter ajudado!

[]'s

A

E como se aplica esse esquema de relógio em um JFrame?

Tipo eu gostaria de colocar o relógio e data aparecendo no menu que inicializa o sistema, até tenho um método aqui mas não consigo inserir ele no menu, ele se inicia como um JFrame separado e fica muito toscão.

Por favor ajudem!!!

Criado 22 de dezembro de 2008
Ultima resposta 13 de jul. de 2014
Respostas 17
Participantes 10