java - 如何添加 "HH:mm:ss"格式的秒表?

标签 java swing user-interface

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

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

关于java - 如何添加 "HH:mm:ss"格式的秒表?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/50393827/

相关文章:

java - 在 ArrayList 中链接两个 ArangoDB 集合时出现反序列化问题

java - 基于 MVC 使用线程的 Swing 应用程序

java - Swing - 使用 UpdateUI 更改面板的内容

c# - 按钮 VisualBrush - 正确使用图标

java - Java API中的类 "Class"和 "class"关键字有什么区别?

java - 用于自动生成表单的 XML 或数据库

java - java应用程序中的进度条和线程错误

java - 调整基本箭头按钮的大小

Java - JPanel 及其内容如何设置边界

java - 如何在java中生成6个不同的随机数