我想仅使用空格键开始/停止秒表。我已经创建了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
}
}}
提前致谢。
答案 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方法的静态调用来检索,因此您将获得第一个空格被击中的时间。
希望得到这个帮助,抱歉没有附上完整的实施。