我如何 start/stop 一个只有空格键的秒表?

How can I start/stop a stop watch with only the spacebar?

我想 start/stop 只使用 space 条的秒表。我已经制作了 KeyListeners,并且只有当您 press/release spacebar.

时它们才会被激活

到目前为止我尝试了什么:

我尝试创建一个秒表 class,它应该计算我第一次按下 space 和第二次按下 space 之间的时差。我试过如下:

 public class Stopwatch {
    public Stopwatch(int i) {
        long time = System.currentTimeMillis();
        if(i%2==1){
            System.out.println("Timer Started at: " + time);
        }else{
            System.out.println("Timer stopped at: " + System.currentTimeMillis());

            System.out.println("Time diff: " + (time - System.currentTimeMillis()));
        }
    }
}

int i 每秒增加 space 条。

我知道这里的问题是每次我启动这个 class 时,time 都会重置为 System.currentTimeMillis() 因为我只按了空格键。因此差异始终为 0.

我怎样才能改变它,以便以某种方式节省我第一次按下 space 的时间?

这是与 Keylisteners 的 class。忽略扰频器class,与我的问题无关

import java.awt.Font;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.awt.event.KeyEvent;
import java.awt.event.KeyListener;

import javax.swing.*;

public class StoppuhrFrame extends JFrame {

    JLabel time, scramble;

    public StoppuhrFrame() {

        time = new JLabel("00:00:00");
        time.setBounds(162, 45, 325, 80);
        time.setFont(new Font("Arial", 100, 80));
        add(time);

        scramble = new JLabel("Scramble: ");
        scramble.setBounds(165, 15, 370, 16);
        add(scramble);

        //Scrambler scrambler = new Scrambler(scramble);

        addKeyListener(new timer());
        setTitle("Cube Timer");
        setLayout(null);
        setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        setResizable(false);
        setSize(650, 270);
        setVisible(true);
    }
    int i = 1;
    public class timer implements KeyListener {
        @Override
        public void keyPressed(KeyEvent keyEvent) {

            if(keyEvent.getKeyCode()==32){
                new Stopwatch(i);
                i++;
            }

        @Override
        public void keyReleased(KeyEvent arg0) {

            if (arg0.getKeyCode() == 32) {
                if(i%2==0){
                    //new Scrambler(scramble);

                }
            }
        }

        @Override
        public void keyTyped(KeyEvent arg0) {
            // TODO Auto-generated method stub
        }
    }
}

提前致谢。

将时间设置为 StopWatch 用户的静态属性 class 用负值初始化(据我了解,它可能是侦听器实例)。然后应用同步方法来获取时间属性的值(静态同步以确保在更新时线程安全地访问该 var)。并应用单例模式 n 来更新值,考虑到按下 space 条时值 > 0 是可能的:

private static long hitTime = -1;
//... 
public synchronized static long getFirstSpaceHitMillis() {
    if (hitTime < 0) {
        // this if ensures the variable will be only updated at first hit
        hitTime = System.currentTimeMillis();
    }
    return hitTime;
}

在 StopWatch class 中,将通过静态调用 getFirstSpaceHitMillis 方法检索初始时间,因此您将获得第一个 space 被击中的时间。

希望这对您有所帮助,很抱歉没有附上完整的实现。

抱歉,我试图将其添加为评论,但没有让我添加 post 代码。 这是我提到的示例 class:

import java.awt.event.KeyEvent;
import java.awt.event.KeyListener;

public class Example  implements KeyListener {

    private static long hitTime = -1;

    @Override
    public void keyPressed(KeyEvent arg0) {
        // This will allways return the time when first space bar was clicked
        long start = getHitTime();
        long actualTime = System.currentTimeMillis();
        // In this case get the seconds..
        long diff = (actualTime - start) / 1000;

        System.out.println(String.format("TIme diff: %s", diff));
    }

    @Override
    public void keyReleased(KeyEvent arg0) {
        // TODO Auto-generated method stub
    }

    @Override
    public void keyTyped(KeyEvent arg0) {
        // TODO Auto-generated method stub
    }

    public synchronized static long getHitTime() {

        if (hitTime < 0) {
            hitTime = System.currentTimeMillis();
        }
        return hitTime;
    }
}

你也不需要秒表 class 因为时间会在第一次按键点击后开始流逝(在这种情况下没有检测到特定的按键所以任何按键点击都会触发事件),并且会计算第一次点击和最后一次点击之间的时间(以毫秒为单位),我将它除以一千以获得点击之间的秒数。

希望对您有所帮助