【问题标题】:Take input hours mins secs from user and start a countdown in hh:mm:ss format从用户那里获取输入小时分钟秒并以 hh:mm:ss 格式开始倒计时
【发布时间】:2017-08-26 11:51:23
【问题描述】:

我在启动计时器以及如何将数据放入日期时遇到问题。

这是我的代码:

Calendar cl = Calendar.getInstance();
cl.set(Calendar.HOUR, 0);
cl.set(Calendar.MINUTE, 0);
cl.set(Calendar.SECOND, 0);
cl.add(Calendar.HOUR, hr);
cl.add(Calendar.MINUTE, min);
cl.add(Calendar.SECOND, sec);
Date date = cl.getTime();
Timer t =new Timer(1000, new ActionListener() {
  @Override
  public void actionPerformed(ActionEvent ae) {
     SimpleDateFormat timeFormat = new SimpleDateFormat("HH:mm:ss");
     jLabel2.setText(timeFormat.format(date));
  }
});
t.start();

使用Calendar将数据放入日期并启动计时器是否正确?

【问题讨论】:

  • 这是作业吗?
  • 它是我的项目,它可以一次运行多个计时器,你能帮我提供我的问题的示例代码
  • Madishetty,我早在 1986 年就已经是一名计算机科学专业的学生。那时我们还没有互联网。现在您拥有所有需要的在线文档。阅读和学习是你的工作。您必须挖掘直到找到解决方案。否则,您希望如何成为一名软件开发人员?
  • 我已经为它写了代码但是定时器没有启动!!!
  • 显示您的代码。你用过调试器吗?

标签: java swing time javax.swing.timer


【解决方案1】:

我认为您不应该为此使用 Calendar。 Calendar 用于表示日历时间中的一个点,而不是以小时、分钟和秒为单位的持续时间。此外,Calendar 现在是旧东西,取而代之的是 Java 8 中新的和对程序员更友好的类(参见 java.time 包)。

我从 cmets 了解到您需要倒数计时器。我建议:

    Timer t = new Timer(1000, new ActionListener() {
        Duration time = Duration.ofHours(hr).plusMinutes(min).plusSeconds(sec);
        @Override
        public void actionPerformed(ActionEvent ae) {
            time = time.minusSeconds(1);
            jLabel2.setText(formatDuration(time));
        }
    });
    t.start();

我正在使用 Duration 类,它是 Java 8 中引入的类之一。它的设计持续时间以小时、分钟和秒为单位,所以这是我们工作所需要的。不过,它不适合格式化。您可以使用它的toString 方法,它会给您一个类似PT9M52S 的字符串,持续时间为9 分52 秒,这可能不是大多数用户认为最直观的。相反,我使用这种辅助方法进行格式化:

static String formatDuration(Duration dur) {
    long hr = dur.toHours();
    Duration remainder = dur.minusHours(hr);
    long min = remainder.toMinutes();
    long sec = remainder.minusMinutes(min).getSeconds();
    return String.format("%02d:%02d:%02d", hr, min, sec);
}

【讨论】:

  • 实际上我想把这个 hr min sec 数据放在一个标签中,倒计时从帮助计时器开始!!!帮我做吧
  • 好的。你的意思是,标签应该首先显示输入的值,然后每秒钟倒数 1 秒?
  • 由于计时器能够失去时间,我会计算计时器自启动以来一直在滴答作响的实际持续时间
  • 好主意,@MadProgrammer。是否值得取决于精度要求。例如,您可以使用Duration.between(startTime, Instant.now()),其中startTime 是启动计时器时的Instant。也许更简单,一旦计算计时器应该达到 0 的时刻,然后使用Duration.between(Instant.now(), endTime)。
猜你喜欢
  • 2014-10-26
  • 2019-02-12
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2022-01-20
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多