停止秒表

Jam*_*gan 3 java timer

我在JPanel类中有以下代码,它被添加到另一个类(JFrame)中.我正在尝试实施的是某种秒表计划.

startBtn.addActionListener(new startListener());

class startListener implements ActionListener {
    public void actionPerformed(ActionEvent e) {
        Timer time = new Timer();
        time.scheduleAtFixedRate(new Stopwatch(), 1000, 1000);
    }
}
Run Code Online (Sandbox Code Playgroud)

这是另一个基本上是任务的课程.

public class Stopwatch extends TimerTask {

    private final double start = System.currentTimeMillis();

    public void run() {
        double curr = System.currentTimeMillis();
        System.out.println((curr - start) / 1000);
    }
}
Run Code Online (Sandbox Code Playgroud)

计时器工作正常,这肯定远未完成,但我不知道如何编码应该停止计时器的停止按钮.有什么建议吗?顺便说一下,我正在使用java.util.timer

编辑:我希望能够在停止后再次启动它(没有重置计时器)

Ash*_*Ash 5

您可以Timer通过呼叫取消整个Timer.cancel(),也可以通过呼叫取消单个任务TimerTask.cancel().

无论哪种方式,您都需要在创建时保留对计时器和/或任务实例的引用,以便您的停止例程可以调用相应的cancel方法.

更新:

所以你有效地希望能够暂停计时器?我认为这不受标准接口的支持java.util.Timer.您可以通过向pause()自定义任务添加方法(或类似方法),记录截至该点的已用时间,以及再次单击开始按钮时重新开始计数来完成此操作.请注意,使用此技术,在完成完成之前,您不会停止计时器任务.它仍然在后台运行,但是当秒表已经启动并且正在"运行"时(即某种标志指示秒表的状态),你只对它做任何事情.

几个笔记:

  • java.util.Timer在非EDT线程上运行,因此如果您在计时器和Swing操作事件中与成员变量进行交互,则需要适当地处理多个线程的含义.可能值得调查javax.swing.Timer,这将引发美国东部时间的事件.

  • 此外,如果你想要一个超级精确的秒表,你可以考虑使用System.nanoTime()而不是currentTimeMillis().


tra*_*god 5

如果javax.swing.Timer是可接受的替代方案,正如@Ash建议的那样,这是一个例子.

import java.awt.BorderLayout;
import java.awt.EventQueue;
import java.awt.Font;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.text.DecimalFormat;
import javax.swing.JButton;
import javax.swing.JFrame;
import javax.swing.JLabel;
import javax.swing.Timer;

/** @see http://stackoverflow.com/questions/2576909 */
public class JTimeLabel extends JLabel implements ActionListener {

    private static final String Start = "Start";
    private static final String Stop = "Stop";
    private DecimalFormat df = new DecimalFormat("000.0");
    private Timer timer = new javax.swing.Timer(100, this);
    private long now = System.currentTimeMillis();

    public JTimeLabel() {
        this.setHorizontalAlignment(JLabel.CENTER);
        this.setText(when());
    }

    public void actionPerformed(ActionEvent ae) {
        setText(when());
    }

    public void start() {
        timer.start();
    }

    public void stop() {
        timer.stop();
    }

    private String when() {
        return df.format((System.currentTimeMillis() - now) / 1000d);
    }

    private static void create() {
        JFrame f = new JFrame();
        f.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);

        final JTimeLabel jtl = new JTimeLabel();
        jtl.setFont(new Font("Dialog", Font.BOLD, 32));
        f.add(jtl, BorderLayout.CENTER);

        final JButton button = new JButton(Stop);
        button.addActionListener(new ActionListener() {
            public void actionPerformed(ActionEvent e) {
                String cmd = e.getActionCommand();
                if (Stop.equals(cmd)) {
                    jtl.stop();
                    button.setText(Start);
                } else {
                    jtl.start();
                    button.setText(Stop);
                }

            }
        });
        f.add(button, BorderLayout.SOUTH);
        f.pack();
        f.setVisible(true);
        jtl.start();
    }

    public static void main(String[] args) {
        EventQueue.invokeLater(new Runnable() {
            public void run() {
                create();
            }
        });
    }
}
Run Code Online (Sandbox Code Playgroud)