È necessario aggiornare il testo in un thread separato ogni secondo.
Idealmente si dovrebbe aggiornare componente Swing solo nel EDT (evento filo dispatcher), ma, dopo che ho provato sulla mia macchina, utilizzando Timer.scheduleAtFixRate mi ha dato risultati migliori:
java.util.Timer http://img175.imageshack.us/img175/8876/capturadepantalla201006o.png
Il javax.swing. versione timer era sempre circa mezzo secondo dietro:
javax.swing.Timer http://img241.imageshack.us/img241/2599/capturadepantalla201006.png
io davvero non so perché.
Ecco il sorgente completo:
package clock;
import javax.swing.*;
import java.util.*;
import java.text.SimpleDateFormat;
class Clock {
private final JLabel time = new JLabel();
private final SimpleDateFormat sdf = new SimpleDateFormat("hh:mm");
private int currentSecond;
private Calendar calendar;
public static void main(String [] args) {
JFrame frame = new JFrame();
Clock clock = new Clock();
frame.add(clock.time);
frame.pack();
frame.setVisible(true);
clock.start();
}
private void reset(){
calendar = Calendar.getInstance();
currentSecond = calendar.get(Calendar.SECOND);
}
public void start(){
reset();
Timer timer = new Timer();
timer.scheduleAtFixedRate(new TimerTask(){
public void run(){
if(currentSecond == 60) {
reset();
}
time.setText(String.format("%s:%02d", sdf.format(calendar.getTime()), currentSecond));
currentSecond++;
}
}, 0, 1000);
}
}
Ecco il sorgente modificato utilizzando javax.swing.Timer
public void start(){
reset();
Timer timer = new Timer(1000, new ActionListener(){
public void actionPerformed(ActionEvent e) {
if(currentSecond == 60) {
reset();
}
time.setText(String.format("%s:%02d", sdf.format(calendar.getTime()), currentSecond));
currentSecond++;
}
});
timer.start();
}
Probabilmente dovrei cambiare il modo in cui la corda con la data viene calcolata, ma non credo che sia il problema qui
Ho letto, che, dal momento che Java 5 la consigliato è: ScheduledExecutorService Ti lascio il compito di implementarlo.
non faccio swing ampiamente, quindi nessuna risposta dettagliata dalla mia, ma Google sembra dare sufficienti indizi: http: // www .google.com/search? q = java + swing + clock Al punto: è necessario aggiornare l'orologio * te * ogni volta in un thread in background. – BalusC
@BalusC ma google estensivamente;) – Bozho