我在Java中是一个非常新的人,仍然在进行此分配,用户可以在“按时”和“倒数”复选框之间进行选择,设置延迟,倒数或按时的时间,新窗口将打开并更改颜色。倒数计时工作正常,它会等待设置的时间,然后启动应用程序。问题在于“按时”选项,一切正常,直到我按下开始按钮,它立即开始。它不等待时间设置。我已经处理了一个多星期。欢迎您提供任何帮助。
{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();
}
答案 0 :(得分:1)
使用LocalTime.parse(set)
来解析设置的时间(您不需要格式化程序,因为您的字符串是ISO 8601格式,LocalTime
的默认值)。 LocalTime
是一天中没有日期的时间。我认为这就是您所需要的。
使用LocalTime.now(ZoneId.of("America/Yellowknife"))
获取当前时间。提供您所需的时区,而不是美国/黄刀。
使用ChronoUnit.MILLIS.between
计算现在和设置时间之间的毫秒差。基本上,这是传递给Thread.sleep
的毫秒数。但是,如果数字为负数,则由于设置的时间已经过期而根本不要睡觉(如果给定数字,Thread.sleep
会抛出异常)。
快乐的编码。
通常会喜欢使用从ScheduledExecutorService
获得的Executors.newScheduledThreadPool
而不是直接调用Thread.sleep
。您可以尝试一下。延迟的计算方法仍与上面相同。
我建议您不要使用SimpleDateFormat
和Date
。这些课程设计欠佳,而且已经过时,尤其是前者非常麻烦。
代码中出现问题的原因可能是:您没有提供日期,只是一天中的某个时间。 SimpleDateFormat
的默认设置为1970年1月1日。由于时间已经过去了(无论您提供的是一天中的什么时间),循环都会立即开始。