代码之家  ›  专栏  ›  技术社区  ›  Lord Jesus

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

  •  0
  • Lord Jesus  · 技术社区  · 6 年前

    我正在用GUI for Java创建一个简单的秒表程序。我在秒表开始的地方添加了一个开始按钮 "seconds:nano" 总体安排

    我实现了另一个按钮,重置,它是停止计时器并重置为“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();   
                }
            });
        }
    }
    

    任何帮助都将不胜感激。

    1 回复  |  直到 6 年前
        1
  •  1
  •   Anonymous    6 年前

    你正在创造一个新的世界 Timer 在…内 actionPerformed 在每个启动和重置按钮上。所以,如果我点击开始三次,重置一次,就有四个计时器。我想你不是故意的。当我按Reset时,你停止的计时器与启动时启动的计时器不同。

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

    您的停止按钮上还没有动作侦听器,但您可能已经意识到了这一点。

    顺便说一下,你 能够重置计数器:至少在我的电脑上,如果我第二次按Start,计数器似乎从0开始重新启动。我相信它来自这一行:

                start = Instant.now();
    

    正如在评论中提到的,代码可能还有其他问题。通过以上内容,我试图回答你只提出的问题。