Jframe - Label dinâmica com Thread

Olá. Criei uma aplicação com um Jframe, onde necessito inserir um relógio dentro do meu Jframe.

Encontrei essa thread interessante na internet:

[code]public class RelogioThread extends JFrame{

JLabel label; // label onde será impressa a hora atual


public RelogioThread(){//construtor
	super("RELÓGIO");//seta o título do JFrame
	setSize(250,60);//seta o tamanho do JFrame
	setVisible(true);//seta visível
	Container tela = getContentPane();//container onde ficara o label
	label = new JLabel();//instancia o label
	tela.add(label);//adiciona o label à tela
	label.setBounds(65,0,45,85);//seta a posição do label
	iniciaRelogio();//inicia o relógio
}

public void iniciaRelogio(){
	new Thread(){//instancia nova thread já implementando o método run()
		@Override
		public void run() {//sobrescreve o método run()

			while(0 == 0){//while para fazer o loop infinito
				GregorianCalendar gc = new GregorianCalendar();//novo gregorian calendar, onde temos a data atual
				int hora = gc.get(Calendar.HOUR_OF_DAY);//pega as horas
				int minuto = gc.get(Calendar.MINUTE);//pega os minutos
				int segundo = gc.get(Calendar.SECOND);//pega os segundos
				String horaString;//nova string horas
				String minString;//nova string minutos
				String segundoString;//nova string segundos
				if(hora < 10){//se hora for menor que 10 precisa colocar um 0 à esquerda
					horaString = "0"+hora;
				}else{
					horaString = ""+hora;
				}
				if(minuto < 10){//se minuto for menor que 10 precisa colocar um 0 à esquerda
					minString = "0"+minuto;
				}else{
					minString = ""+minuto;
				}
				if(segundo < 10){//se segundo for menor que 10 precisa colocar um 0 à esquerda
					segundoString = "0"+segundo;
				}else{
					segundoString = ""+segundo;
				}
				label.setText(horaString+":"+minString+":"+segundoString);//seta hora atual no label
				try{
					sleep(1000);//faz a thread entrar em estado de espera por 1000 milissegundos ou 1 segundo
				}catch(Exception e){}
			}
		}
	}.start();//inicia a thread.
}[/code]

Contudo não gostaria de criar uma janela nova, e sim acoplar esta thread dentro de um label na minha Jframe.
É possível? Vlw =]

Olá

Se você mudar a herança de JFrame para JLabel, dai setar o conteúdo no text do JLabel, acho que resolve seu problema.

Ahh… eu não usaria thread para fazer isso, tem um jeito mais simples Timetask, segue um tópico com exemplo: http://www.guj.com.br/posts/list/106812.java

Espero ter ajudado
Flwsss

veja isso…http://www.guj.com.br/posts/list/224210.java

ai eu monto um relogio…

t+

Há pouquíssimos dias teve um tópico sobre isso. O assunto é bem recorrente no GUJ. Procure usar a busca do fórum (ou do google) antes de perguntar. Aqui estão dois links que resolvem esse assunto:
http://www.guj.com.br/posts/list/208780.java#1061757
http://www.guj.com.br/posts/list/52964.java#279083 (veja também os 2 posts da página seguinte)

O segundo mostra com Threads, java.util.Timer e javax.Swing.Timer.

Não recomendo baixar uma API externa pra tão pouco.

Na verdade, a minha dificuldade é com o Jframe/NETBEANS.

Como criar um Jframe dinâmico? Eu possuo outros elementos gráficos, botões com eventos, tudo OK.
O que tá pegando é esse Label dinâmico que não sei como fazer mesmo :confused:
Esses exemplos não foram esclarecedores, eu já havia pesquisado.

[quote=ViniGodoy]Há pouquíssimos dias teve um tópico sobre isso. O assunto é bem recorrente no GUJ. Procure usar a busca do fórum (ou do google) antes de perguntar. Aqui estão dois links que resolvem esse assunto:
http://www.guj.com.br/posts/list/208780.java#1061757
http://www.guj.com.br/posts/list/52964.java#279083 (veja também os 2 posts da página seguinte)

O segundo mostra com Threads, java.util.Timer e javax.Swing.Timer.

Não recomendo baixar uma API externa pra tão pouco.[/quote]

O Thread está funcionando. Como falei, a dificuldade com o Jframe/NETBEANS, o problema é que não sei como inserir meu thread dentro do meu JFrame, pois tenho outros elementos neles, como botões, etc.

Não use threads à toa. Use um javax.swing.Timer, que usa apenas 1 thread para todos os timers necessários (mesmo que você crie N instâncias de javax.swing.Timer no seu programa).

E como de costume, veja mais uma vez o exemplo dado em:

http://www.guj.com.br/posts/list/208780.java#1061757

Ele mostra horas, minutos e segundos, mas como você pode ajustar o formato para qualquer formato desejado, você poderia ter algo como:

package guj;

import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.text.DateFormat;
import java.text.SimpleDateFormat;
import java.util.Date;

import javax.swing.JLabel;
import javax.swing.Timer;

public class Relogio extends JLabel {

    public Relogio() {
        super();
        timerAtualizacao = new Timer(500, new ActionListener() {
            @Override
            public void actionPerformed(ActionEvent arg0) {
                setText(df.format(new Date()));
            }
        });
        timerAtualizacao.start();
    }

    public void setFormato(String formato) {
        df = new SimpleDateFormat(formato);
    }

    private Timer timerAtualizacao;
    private DateFormat df = new SimpleDateFormat("HH:mm:ss");
}
package guj;

import java.awt.BorderLayout;

import javax.swing.JFrame;
import javax.swing.JPanel;
import javax.swing.SwingUtilities;

public class ExemploRelogio extends JFrame {

    private static final long serialVersionUID = 1L;
    private JPanel jContentPane = null;
    private JPanel pnlMain = null;
    private Relogio rel01 = null;
    private Relogio rel02 = null;
    private Relogio rel03 = null;

    private Relogio getRel01() {
        if (rel01 == null) {
            rel01 = new Relogio();
            rel01.setFormato("dd/MM/yyyy HH:mm:ss.SSS");
        }
        return rel01;
    }

    private Relogio getRel02() {
        if (rel02 == null) {
            rel02 = new Relogio();
            rel02.setFormato("hh:mm:ss a");
        }
        return rel02;
    }

    private Relogio getRel03() {
        if (rel03 == null) {
            rel03 = new Relogio();
            rel03.setFormato("EEEEE, dd 'de' MMMMM 'de' yyyy, HH:mm:ss");
        }
        return rel03;
    }

    private JPanel getPnlMain() {
        if (pnlMain == null) {
            pnlMain = new JPanel();
            pnlMain.setLayout(new BorderLayout());
            pnlMain.add(getRel01(), BorderLayout.NORTH);
            pnlMain.add(getRel02(), BorderLayout.CENTER);
            pnlMain.add(getRel03(), BorderLayout.SOUTH);
        }
        return pnlMain;
    }

    public static void main(String[] args) {
        SwingUtilities.invokeLater(new Runnable() {
            public void run() {
                ExemploRelogio thisClass = new ExemploRelogio();
                thisClass.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
                thisClass.setVisible(true);
            }
        });
    }

    public ExemploRelogio() {
        super();
        initialize();
    }

    private void initialize() {
        this.setSize(300, 200);
        this.setContentPane(getJContentPane());
        this.setTitle("Exemplo de Relógio em um JFrame");
    }

    private JPanel getJContentPane() {
        if (jContentPane == null) {
            jContentPane = new JPanel();
            jContentPane.setLayout(new BorderLayout());
            jContentPane.add(getPnlMain(), BorderLayout.NORTH);
        }
        return jContentPane;
    }

}


Agradeço a todos que tentaram ajudar, eu já ví exemplos interessantes de relógio, existem váários no forum.
Não vou mais criar uma thread pra isso, porém a minha dúvida não é no relógio, e sim em inserir isso no meu Jframe.

O Netbeans parece super engessado! Está muito difícil =/

Mas é na verdade bastante simples. Vou pegar o mesmo exemplo (que criei no Eclipse), e pô-no no Netbeans para você ver.

[quote=entanglement]Mas é na verdade bastante simples. Vou pegar o mesmo exemplo (que criei no Eclipse), e pô-no no Netbeans para você ver.
[/quote]

Eu sou noob no Jframe… Programar a parte gráfica na unha é melhor? Eu não uso netbeans, só baixei pra este projeto por causa do Jframe, mas achei engessado!
Acho que vou estudar essa parte de interface gráfica. Como neste projeto a “beleza e organização gráfica” são o de menos, baixei o Jframe pra ser mais rápido =)

Muito obrigado pela ajuda e boa vontade!

  1. Copie o arquivo Relogio.java (o que já postei acima) em algum lugar do seu projeto.
  2. Compile seu projeto.
  3. Arraste Relogio.java onde você quiser que ele fique no seu JFrame.
  4. Acerte a propriedade “Formato” como você quiser que fique seu relógio.

Pronto! Agora deve funcionar.


[quote=entanglement]0) Copie o arquivo Relogio.java (o que já postei acima) em algum lugar do seu projeto.

  1. Compile seu projeto.
  2. Arraste Relogio.java onde você quiser que ele fique no seu JFrame.
  3. Acerte a propriedade “Formato” como você quiser que fique seu relógio.

Pronto! Agora deve funcionar. [/quote]

Tá brincando que eu posso arrastar a classe pra dentro do projeto? :shock:
Quando chegar em casa eu vou tentar, desde já te agradeço MUITO pela boa vontade!
Te devo uma breja :smiley:

Não pule o passo 1 (Compilar o projeto). Se pular isso, o .class do Relogio.java não terá sido gerado, e você não conseguirá arrastar o componente para dentro do frame. OK?

Pode deixar, quando eu mexer nisso posto aqui os resultados! :>

Cara, deu certíssimo! Além de ser uma solução simples, consegui entender coisas fundamentais sobre JFrame.
Muitissimo obrigado! :>

Isso pode fazer parte de uma série “Como é fácil criar componentes visuais no NetBeans”. Se eu tiver muita paciência, talvez faça um relógio analógico.

É possível o usuário setar um horário? Se eu criar um JTextField ou algo do tipo, como limito a quantidade de caracteres e aplico uma máscara? E limito pra numérico? vlw =)