我正在做这个分配,用户在"准时"和"倒计时"复选框之间进行选择,设置延迟时间、倒计时或准时,新窗口打开并改变颜色。倒计时工作正常,它会等待设置的时间,之后应用程序启动。问题在于"准时"选项,在我按下开始按钮之前一切正常,它会立即启动。它不会等待设定的时间。
{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
。你可以试试。计算延迟的方法仍与上述相同。
不要使用简单日期格式和日期
我建议你不要使用SimpleDateFormat
和Date
。这些课程设计不佳且早已过时,前者尤其臭名昭著地麻烦。
您的代码中出错的地方可能是:您没有提供日期,只提供一天中的时间。SimpleDateFormat
默认为 1970 年 1 月 1 日。由于该时间早已过去(无论您在一天中的哪个时间提供),循环都会立即开始。
链接
- Oracle 教程:日期时间解释如何使用 java.time。
- 维基百科文章:ISO 8601