Java 从用户处输入小时分秒,并以hh:mm:ss格式开始倒计时

Java 从用户处输入小时分秒,并以hh:mm:ss格式开始倒计时,java,swing,time,javax.swing.timer,Java,Swing,Time,Javax.swing.timer,我面临的问题是启动计时器以及如何将数据放入日期 这是我的代码: 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 =

我面临的问题是启动计时器以及如何将数据放入日期

这是我的代码:

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
现在已经是老东西了,取而代之的是Java8中新的、对程序员更友好的类(请参阅
Java.time
包)

我从评论中了解到你想要一个倒计时。我建议:

    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
类,它是Java8中引入的类之一。它设计的持续时间以小时、分钟和秒为单位,因此这是我们工作所需要的。不过,它本身不适合格式化。您可以使用它的
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)