Java中的摆动计时器秒表 [英] Swing Timer stopwatch in Java

查看:28
本文介绍了Java中的摆动计时器秒表的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

有人可以为我提供一个使用不断更新的 JLabel 的 Java Swing Timer 秒表 GUI 示例吗?我不熟悉使用@Override,所以除非绝对必要,否则请不要建议使用它的代码(我已经完成了其他 Swing Timer,例如系统时钟,但没有它).

Can someone provide me an example of a Swing Timer stopwatch GUI in Java using a constantly-updating JLabel? I am not familiar with using @Override, so please don't suggest code with that in it unless it is absolutely necessary (I've done other Swing Timers, such as a system clock, without it).

谢谢!

根据@VGR 的要求,这是我使用摆动计时器的基本时钟的代码:

As per @VGR's request, here's the code I have for my basic clock that uses a Swing Timer:

import java.awt.Container;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.awt.FlowLayout;
import java.util.Calendar;
import java.util.Date;
import java.util.TimeZone;
import javax.swing.JFrame;
import javax.swing.JLabel;
import java.awt.Font;

public class basic_clock extends JFrame
{
    JLabel date, time;

    public basic_clock()
    {
        super("clock");

        ActionListener listener = new ActionListener()
        {
            public void actionPerformed(ActionEvent event)
            {
                Calendar current = Calendar.getInstance();
                current.setTime(new Date());
                date.setText((current.get(Calendar.MONTH) + 1) +"/" +current.get(Calendar.DATE) +"/" +current.get(Calendar.YEAR));
                String timeStr = String.format("%d:%02d:%02d", current.get(Calendar.HOUR), current.get(Calendar.MINUTE), current.get(Calendar.SECOND));
                time.setText(timeStr);                
            }
        };

        date = new JLabel();
        time = new JLabel();

        setLayout(new FlowLayout());
        setSize(310,190);
        setResizable(false);
        setVisible(true);

        add(date);
        add(time);

        date.setFont(new Font("Arial", Font.BOLD, 64));
        time.setFont(new Font("Arial", Font.BOLD, 64));

        javax.swing.Timer timer = new javax.swing.Timer(500, listener);
        timer.setInitialDelay(0);
        timer.start();
    }

    public static void main(String args[])
    {

        basic_clock c = new basic_clock();
        c.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
    }
}

显然我需要与 Calendar 对象不同的东西,因为我想跟踪最接近 1/100 秒的分钟和秒,而不是日期/月/年/小时/分钟/秒.

Obviously I need something different than the Calendar object since I want to keep track of minutes and seconds to the nearest 1/100th of a second instead of date/month/year/hour/minute/second.

推荐答案

我为此做了谷歌,但我不理解我找到的代码

I did Google for it, but I wasn't understanding the code that I found

那么你有一个更大的问题.您希望我们中的任何人为您提供一个您能理解的示例?

Then you have a bigger problem. How do you expect any of us to provide you with an example you can understand?

秒表在概念上非常简单,它只是自启动以来经过的时间量.当您希望能够暂停计时器时会出现问题,因为您需要考虑计时器运行的时间加上自上次启动/恢复以来的时间.

A stop watch is conceptually pretty simple, it's simply the amount of time that has passed since it was started. Problems arise when you want to be able to pause the timer, as you need to take into account the amount of time the timer has been running plus the time since it was last started/resumed.

另一个问题是,大多数计时器只能保证最少的时间,因此它们是不精确的.这意味着您不能一直将计时器的延迟量添加到某个变量中,您最终会得到一个漂移值(不准确)

Another issue is, most timers only guarantee a minimum amount of time, so they are imprecise. This means you can't just keep adding the amount of the timer's delay to some variable, you'll eventually end up with a drifting value (inaccurate)

这是一个非常简单的例子,它所做的只是提供一个开始和停止按钮.每次启动秒表,又从0开始.

This is a very simple example, all it does is provides a start and stop button. Each time the stop watch is started, it starts from 0 again.

import java.awt.EventQueue;
import java.awt.GridBagConstraints;
import java.awt.GridBagLayout;
import java.awt.Insets;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.time.Duration;
import javax.swing.JButton;
import javax.swing.JFrame;
import javax.swing.JLabel;
import javax.swing.JPanel;
import javax.swing.Timer;
import javax.swing.UIManager;
import javax.swing.UnsupportedLookAndFeelException;

public class SimpleStopWatch {

    public static void main(String[] args) {
        new SimpleStopWatch();
    }

    public SimpleStopWatch() {
        EventQueue.invokeLater(new Runnable() {
            @Override
            public void run() {
                try {
                    UIManager.setLookAndFeel(UIManager.getSystemLookAndFeelClassName());
                } catch (ClassNotFoundException | InstantiationException | IllegalAccessException | UnsupportedLookAndFeelException ex) {
                    ex.printStackTrace();
                }

                JFrame frame = new JFrame("Testing");
                frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
                frame.add(new StopWatchPane());
                frame.pack();
                frame.setLocationRelativeTo(null);
                frame.setVisible(true);
            }
        });
    }

    public class StopWatchPane extends JPanel {

        private JLabel label;
        private long lastTickTime;
        private Timer timer;

        public StopWatchPane() {
            setLayout(new GridBagLayout());
            label = new JLabel(String.format("%04d:%02d:%02d.%03d", 0, 0, 0, 0));

            timer = new Timer(100, new ActionListener() {
                @Override
                public void actionPerformed(ActionEvent e) {
                    long runningTime = System.currentTimeMillis() - lastTickTime;
                    Duration duration = Duration.ofMillis(runningTime);
                    long hours = duration.toHours();
                    duration = duration.minusHours(hours);
                    long minutes = duration.toMinutes();
                    duration = duration.minusMinutes(minutes);
                    long millis = duration.toMillis();
                    long seconds = millis / 1000;
                    millis -= (seconds * 1000);
                    label.setText(String.format("%04d:%02d:%02d.%03d", hours, minutes, seconds, millis));
                }
            });

            GridBagConstraints gbc = new GridBagConstraints();
            gbc.gridx = 0;
            gbc.gridy = 0;
            gbc.weightx = 1;
            gbc.gridwidth = GridBagConstraints.REMAINDER;
            gbc.insets = new Insets(4, 4, 4, 4);
            add(label, gbc);

            JButton start = new JButton("Start");
            start.addActionListener(new ActionListener() {
                @Override
                public void actionPerformed(ActionEvent e) {
                    if (!timer.isRunning()) {
                        lastTickTime = System.currentTimeMillis();
                        timer.start();
                    }
                }
            });
            JButton stop = new JButton("Stop");
            stop.addActionListener(new ActionListener() {
                @Override
                public void actionPerformed(ActionEvent e) {
                    timer.stop();
                }
            });

            gbc.gridx = 0;
            gbc.gridy++;
            gbc.weightx = 0;
            gbc.gridwidth = 1;
            add(start, gbc);
            gbc.gridx++;
            add(stop, gbc);
        }

    }

}

添加暂停功能并不难,它只需要一个额外的变量,但我会留给你来解决.

Adding a pause feature isn't hard, it would simply require one additional variable, but I'll leave that up to you to figure out.

这篇关于Java中的摆动计时器秒表的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆