繁体   English   中英

如何以“ HH:mm:ss”格式添加秒表?

[英]How to add stopwatch in “HH:mm:ss” format?

我正在Java的GUI中创建一个简单的秒表程序。 我添加了一个开始按钮,以"seconds:nano"格式开始秒表。

我实现了另一个按钮,Reset,该按钮可停止计时器并在需要时重置为“ 0:0”。 我尝试使用timer.stop()但无法使秒表重置。 我可以知道我做了什么问题吗?

码:

import java.awt.Color;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.time.Duration;
import java.time.Instant;

import javax.swing.JButton;
import javax.swing.JFrame;
import javax.swing.JLabel;
import javax.swing.JPanel;
import javax.swing.Timer;

public class GuiStopwatch {
    public static void main(String[] args) {
        JFrame frame = new JFrame("Stopwatch");

        frame.setSize(500, 500);
        frame.setDefaultCloseOperation(frame.EXIT_ON_CLOSE);
        frame.setVisible(true);
        JPanel panel = new JPanel();

        panel.setLayout(null);

        JButton Startbtn = new JButton("START");  
        JButton Stopbtn = new JButton("STOP");
        JButton Reset = new JButton("RESET");
        JLabel time = new JLabel("Time shows here");
        panel.add(Startbtn);
        panel.add(Stopbtn);
        panel.add(Reset);
        panel.add(time);
        Startbtn.setBounds(50, 150, 100, 35);
        Stopbtn.setBounds(50, 200, 100, 35);
        Reset.setBounds(50, 250, 100, 35);
        time.setBounds(50, 350, 100, 35);
        time.setBackground(Color.black);
        time.setForeground(Color.red);
        frame.add(panel);

        Startbtn.addActionListener(new ActionListener() {
            Instant start;

            @Override
            public void actionPerformed(ActionEvent e) {
                start = Instant.now();

                Timer timer = new Timer(1,new ActionListener() {

                    @Override
                    public void actionPerformed(ActionEvent e) {

                        time.setText( Duration.between(start, Instant.now()).getSeconds() +  ":" + Duration.between(start, Instant.now()).getNano() );
                    }
                });
                timer.start();
            }
        });

        Reset.addActionListener(new ActionListener() {

            @Override
            public void actionPerformed(ActionEvent e) {
                Timer timer1 = new Timer(1,new ActionListener() {

                    @Override
                    public void actionPerformed(ActionEvent e) {
                        time.setText( "test" );
                    }
                });
                timer1.stop();   
            }
        });
    }
}

任何帮助,将不胜感激。

您正在在“开始”和“重置”按钮的每一个上执行的actionPerformed内部创建一个新的Timer 因此,如果我单击“开始”三次,然后单击“重置”一次,则有四个计时器。 我不认为你打算那样做。 当我按“重置”时,您将停止与“开始”中启动的计时器不同的计时器。

您总共只需要一个计时器。 在动作侦听器外部声明它,以便两个动作侦听器都可以操纵它。

您的“停止”按钮上还没有动作监听器,但是您可能已经意识到了。

顺便说一句, 可以重置计数器:至少在我的电脑上,如果我按启动第二次时,计数器似乎从0开始了,我相信它来自该行:

            start = Instant.now();

如注释中所述,您的代码可能还有其他问题。 通过以上内容,我试图回答您仅提出的问题。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM