Tenho um Frame com um JInternalFrame que carrega uma telinha com a data(dd/MM/yyyy) e a hora(HH:mm:ss) eu queira que a a hora fosse atualizada a cada segundo.
public void mostrahorario(){
GridBagConstraints cons = new GridBagConstraints();
GridBagLayout layout = new GridBagLayout();
setLayout(layout);
cons.anchor = GridBagConstraints.CENTER;
cons.fill = GridBagConstraints.BOTH;
cons.insets = new Insets(4,4,4,4);
DateFormat formatdate = new SimpleDateFormat("dd/MM/yyyy HH:mm:ss");
Date data = new Date();
JLabel titulodataJL = new JLabel("DATA DO SISTEMA");
titulodataJL.setFont(new Font(null,Font.BOLD,20));
JLabel dataJL = new JLabel(formatdate.format(data));
dataJL.setFont(new Font(null,Font.BOLD,20));
JLabel nomecontaJL = new JLabel();
getContentPane().add(titulodataJL, cons);
cons.gridy = 3;
getContentPane().add(dataJL, cons);
cons.gridy = 2;
getContentPane().add(nomecontaJL,cons);
cons.gridy = 2;
}
A resposta mais simples para seu problema é Threads. Talvez o padrão Observer ajude, pois seria uma das maneiras mais fáceis de atualizar o seu dataJL. Na seção de tutoriais tem uma explicação bem legal sobre Observer (apesar que talvez nem seja necessário, dependendo da situação somente Threads podem resolver).
Só mais uma dica: prefira usar a class Calendar a usar a Date, que já tem vários métodos e construtores deprecated.
[quote=sergio_ferraz]Se for usar threads, pode fazer algo semelhante a isso:
public class Sample implements Runnable{
public void run() {
while(true) {
Date d = new Date();
DateFormat df = new SimpleDateFormat("dd/MM/yyyy HH:mm:ss");
System.out.println(df.format(d)); //Aqui você atualizaria seu Label
try {
Thread.sleep(1000);
}
catch(InterruptedException e) {
e.printStackTrace();
}
}
}
public static void main(String [] args) {
Thread t = new Thread(new Sample());
t.start();
}
}
Lembrando que não é garantido que o método run() irá executar sempre à cada 1 segundo, e sim pelo menos à cada 1 segundo.[/quote]
Imagine ter criar um objeto Date e um SimpleDateFormat a cada iteração. O processamento vai parar onde? Crie apenas um, algo como:
import java.text.DateFormat;
import java.text.SimpleDateFormat;
import java.util.Calendar;
public class Relogio implements Runnable {
private static final DateFormat FORMATTER = new SimpleDateFormat(
"dd/MM/yyyy HH:mm:ss");
@Override
public void run() {
Calendar c = Calendar.getInstance();
while (true) {
System.out.println(FORMATTER.format(c.getTime()));
c.set(Calendar.SECOND, c.get(Calendar.SECOND) + 1);
try {
Thread.sleep(1000);
} catch (InterruptedException ex) {
ex.printStackTrace();
}
}
}
public static void main(String[] args) {
new Thread(new Relogio()).start();
}
}
Se for usar threads, pode fazer algo semelhante a isso:
public class Sample implements Runnable{
public void run() {
while(true) {
Date d = new Date();
DateFormat df = new SimpleDateFormat("dd/MM/yyyy HH:mm:ss");
System.out.println(df.format(d)); //Aqui você atualizaria seu Label
try {
Thread.sleep(1000);
}
catch(InterruptedException e) {
e.printStackTrace();
}
}
}
public static void main(String [] args) {
Thread t = new Thread(new Sample());
t.start();
}
}
Lembrando que não é garantido que o método run() irá executar sempre à cada 1 segundo, e sim pelo menos à cada 1 segundo.