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 !?
/* Legenda:
dataHorario = JLabel
sdf = SimpleDateFormat
*/
[/code]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.
“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 !?
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?
[quote=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? [/quote]
você quer dizer assim:
[code]
public Janela(){
Hora();
}
public static void Hora(){
try {
while (true) {
Thread.sleep(1000);
dataHorario.setText(sdf.format(new Date()));
}
} catch (Exception e) {
e.printStackTrace();
}
}
[/code] 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.
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) {
}
}
}
}
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!?
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.