如何仅使用空格键来启动/停止秒表?

时间:2016-11-14 11:26:14

标签: java swing stopwatch

我想仅使用空格键开始/停止秒表。我已经创建了KeyListeners,并且只有在按下/释放空格键时才会激活它们。

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

我尝试创建一个秒表类,它应该计算我第一次按空格键和第二次按空格键之间的时差。我尝试了如下:

 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

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

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

这是Keylisteners的课程。忽略Scrambler类,它与我的问题无关。

    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

        }

    }}

提前致谢。

2 个答案:

答案 0 :(得分:1)

抱歉,我试图将其添加为评论,但不允许我发布代码。 HEre是我提到的示例类

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;
    }
}

你也不需要秒表类,因为时间将在第一次按键后开始传递(在这种情况下,没有检测到特定键,所以任何按键命中都会触发事件),并计算第一次点击和第一次点击之间的时间差。最后一个以毫克为单位,我将其除以千分之一,以达到命中之间的秒数。

希望这有帮助

答案 1 :(得分:0)

将时间设置为使用负值初始化的StopWatch用户类的静态属性(据我所知,它可能是侦听器实例)。然后应用synchronized方法获取time属性的值(静态同步以确保在更新时对该var进行线程安全访问)。并且考虑到值&gt;并应用单个模式n来更新该值。按空格键时可以使用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类中,初始化时间将通过对getFirstSpaceHitMillis方法的静态调用来检索,因此您将获得第一个空格被击中的时间。

希望得到这个帮助,抱歉没有附上完整的实施。