2012-04-11 7 views
2

Ich habe eine TimerTask geschrieben, um das aktuelle Datum und die aktuelle Uhrzeit in einem JLabel anzuzeigen. Es folgt der TimerTask-Code, der im normalen Szenario gut funktioniert. Wenn ich Systemdatum und -zeit bei laufender GUI ändere, wird der Timer nicht mehr ausgeführt. Es gab keine Ausnahme, als ich Systemdatum und -zeit änderte und der Timer hörte gerade auf zu laufen. Kann mir jemand sagen, was passiert?TimerTask, das Systemdatum und -uhrzeit erhält, wird nicht mehr ausgeführt, wenn das Systemdatum geändert wird

private void startTimer() 
{ 
    // Start the clock 
    timer = new Timer(); 
    timer.schedule(new TimeTask(), 0, 1000); 
} 

class TimeTask extends TimerTask 
{ 
    public void run() 
    { 
     try { 
      clockLabel.setText(new SimpleDateFormat("EEE , dd MMM , HH:mm:ss").format(Calendar.getInstance().getTime())); 
      System.out.println(clockLabel.getText()); 
     } catch(Exception ex) { 
      ex.printStackTrace(); 
      System.out.println("Exception : " + ex.getMessage()); 
     } 
    } 
} 

Antwort

4

Sie Timertask nicht mit Schaukel benutzen, wie Sie leicht in Concurrency Probleme laufen können als Timertask-Code aufrufen wird der EDT ab. Verwenden Sie stattdessen einen Swing-Timer. Dies ist genau das, wofür es gebaut ist - periodischen Aufruf von Code im Swing Event-Thread.

dh

private void startTimer() { 
    timer = new Timer(TIMER_DELAY, new TimerListener()); 
    timer.start(); 
} 

private class TimerListener implements ActionListener { 
    private final String PATTERN = "EEE , dd MMM , HH:mm:ss"; 
    private final DateFormat S_DATE_FORMAT = new SimpleDateFormat(PATTERN); 

    @Override 
    public void actionPerformed(ActionEvent e) { 
    Date date = Calendar.getInstance().getTime(); 

    String dateString = S_DATE_FORMAT.format(date); 
    clockLabel.setText(dateString);   
    } 
} 
3
  • Sie Probleme mit Concurency in Swing erhalten haben, in denen die Produktion von java.util.Timer nicht EventDispatchThread nicht aufrufen und stellt Backgroung Aufgabe für Swing-GUI,

  • da wird besser Verwenden Sie Swing Timer, weil die Ausgabe auf EDT garantiert ist, aber Swing Timer ist nicht genau für lange laufende Aufgaben im Vergleich zu java.util.Timer,

  • für Swing-GUI von jeder Art von Hintergrund-Tasks Aktualisieren Sie in invokeLater

zum Beispiel wickeln Ausgabe an den Swing-GUI haben

EventQueue.invokeLater(new Runnable() { 

    @Override 
    public void run() { 
     JLabel#setText(); 
    } 
}); 
Verwandte Themen