Java 获取系统日期和时间的TimerTask在系统日期更改时停止运行

Java 获取系统日期和时间的TimerTask在系统日期更改时停止运行,java,swing,Java,Swing,我编写了一个TimerTask以在JLabel中显示当前日期和时间。下面是TimerTask代码,它在正常情况下运行良好。当我更改GUI运行时的系统日期和时间时,计时器停止运行。当我更改系统日期和时间,计时器停止运行时,也没有例外。 有人能告诉我发生了什么事吗 private void startTimer() { // Start the clock timer = new Timer(); timer.schedule(new TimeTask(), 0, 1000)

我编写了一个TimerTask以在JLabel中显示当前日期和时间。下面是TimerTask代码,它在正常情况下运行良好。当我更改GUI运行时的系统日期和时间时,计时器停止运行。当我更改系统日期和时间,计时器停止运行时,也没有例外。 有人能告诉我发生了什么事吗

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());
        }
    }
}

不要在Swing中使用TimerTask,因为TimerTask将调用EDT中的代码,所以很容易遇到并发问题。而是使用摆动计时器;这就是构建它的具体目的——在Swing事件线程上定期调用代码

i、 e

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);         
  }
}
  • 您遇到的问题是,
    java.util.Timer
    的输出不调用并表示Swing GUI的后台任务

  • 因为将更好地使用,因为保证输出将在EDT上,但是与
    java.util.Timer
    相比,
    Swing Timer
    对于长时间运行的tak来说并不准确

  • 要从任何类型的后台任务更新Swing GUI,必须将Swing GUI的输出包装到
    invokeLater

比如说

EventQueue.invokeLater(new Runnable() {

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