为什么我的计时器不等待设置的时间?如何解决?



我正在做这个分配,用户在"准时"和"倒计时"复选框之间进行选择,设置延迟时间、倒计时或准时,新窗口打开并改变颜色。倒计时工作正常,它会等待设置的时间,之后应用程序启动。问题在于"准时"选项,在我按下开始按钮之前一切正常,它会立即启动。它不会等待设定的时间。

{if (jCheckBox1.isSelected())
st=true;
set = jFormatted.getText();
SimpleDateFormat sdf = new SimpleDateFormat("HH:mm:ss");

try 
Date  date = sdf.parse(set);
date.toString();
catch (ParseException ex) 
Logger.getLogger(TimerApp.class.getName()).log(Level.SEVERE, null, ex);

sw = new SwingWorker() 
@Override
protected Object doInBackground() throws Exception 

Thread.sleep(s.getTime1());
FrameBoja.Pocetak();
while(st)

FrameBoja.cf.getContentPane().setBackground(s.getColor());
Thread.sleep(s.getSpeed());
FrameBoja.cf.getContentPane().setBackground(new Color (44,62,80)); 
Thread.sleep(s.getSpeed());  

return null;


sw.execute();

}

来自 java.time 的 LocalTime

使用LocalTime.parse(set)解析设置的时间(您不需要格式化程序,因为您的字符串采用 ISO 8601 格式,默认值为LocalTime)。LocalTime是一天中没有日期的时间。我认为这就是你需要的。

使用LocalTime.now(ZoneId.of("America/Yellowknife"))获取当前时间。提供您想要的时区,而不是美国/耶洛奈夫。

使用ChronoUnit.MILLIS.between计算现在和设置时间之间的毫秒差。基本上这是传递给Thread.sleep的毫秒数。但是,如果数字为负数,则根本不要睡觉,因为设置的时间已经过期(如果您给它一个负数,Thread.sleep会引发异常)。

并使用 ScheduledExecutorService

人们通常更喜欢使用从Executors.newScheduledThreadPool​获得的ScheduledExecutorService,而不是直接呼叫Thread.sleep。你可以试试。计算延迟的方法仍与上述相同。

不要使用简单日期格式和日期

我建议你不要使用SimpleDateFormatDate。这些课程设计不佳且早已过时,前者尤其臭名昭著地麻烦。

您的代码中出错的地方可能是:您没有提供日期,只提供一天中的时间。SimpleDateFormat默认为 1970 年 1 月 1 日。由于该时间早已过去(无论您在一天中的哪个时间提供),循环都会立即开始。

链接

  • Oracle 教程:日期时间解释如何使用 java.time。
  • 维基百科文章:ISO 8601

最新更新