为什么我的计时器不等待设置的时间?怎么修?

时间:2019-07-12 22:32:38

标签: java time timer sleep

我在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();

}

1 个答案:

答案 0 :(得分:1)

java.time中的LocalTime

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

使用LocalTime.now(ZoneId.of("America/Yellowknife"))获取当前时间。提供您所需的时区,而不是美国/黄刀。

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

快乐的编码。

并使用ScheduledExecutorService

通常会喜欢使用从ScheduledExecutorService获得的Executors.newScheduledThreadPool​而不是直接调用Thread.sleep。您可以尝试一下。延迟的计算方法仍与上面相同。

不要使用SimpleDateFormat和Date

我建议您不要使用SimpleDateFormatDate。这些课程设计欠佳,而且已经过时,尤其是前者非常麻烦。

代码中出现问题的原因可能是:您没有提供日期,只是一天中的某个时间。 SimpleDateFormat的默认设置为1970年1月1日。由于时间已经过去了(无论您提供的是一天中的什么时间),循环都会立即开始。

链接