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

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.

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

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

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!

1 curtida

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

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

Obrigado mesmo assim pelo conselho!

Abraços!

[quote=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

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

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![/quote]

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!

é, ainda ta dando erro hehe :

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

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!

[quote=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![/quote]
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!

Beleza parceiro.

Precisando, estamos aí!

Abraços!

Talvez voce crio o atualizador antes de criar o label.

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

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.

bem deveria sair num jlabel.

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

Bom dia!

atualizando o tópico.

Criando a classe:

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

}[/code]

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

AtualizadorHorario.start(textFieldHorario);

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

[quote=bucha]Bom dia!

atualizando o tópico.

Criando a classe:

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

}[/code]

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

Que bom ter ajudado!

[]'s

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