【问题标题】:Duration class returning incorrect duration between keystrokesDuration 类在击键之间返回不正确的持续时间
【发布时间】:2022-01-15 06:11:24
【问题描述】:

我正在尝试检索按键之间的持续时间(以毫秒为单位)。在这种情况下,我只是在 KeyEvents 方法 keypressed 和 keyreleased 之间轻按一下。我正在使用 Duration 类,最初它可以工作,但现在它记录的时间跨度不正确。

我在 keypressed 和 keyreleased 方法中记录时间,添加代码 start = Instant.now();和 end = Instant.now();分别对每种方法。在 keyreleased 类中,然后我通过编码来测量持续时间

Duration span = Duration.between();
long timelapse = span.toMillis();

如果我调试,IDE 控制台中的变量显示如下:

开始 = "2022-01-15T05:48:32.065492Z"

end = "2022-01-15T05:48:38.5196766Z"

span = "PT6.454184S" {seconds = 6 ,nanos = 454184000 }

如果我要以毫秒为单位检索持续时间的值,span.toMillis() = 6454,我知道我没有按住密钥 6 秒。大概在 30 到 100 毫秒之间。

我能做些什么来纠正这个问题吗?如果没有,是否有另一种方法可以找到击键之间的准确持续时间?

编辑:我确实想指出,这些方法实际上是测量用户输入之间经过的时间量。这样做的原因是为了计算运动。按住按钮的时间决定了图像移动的距离。在这种情况下,我只是轻按一下,我只希望图像在没有任何移动的情况下改变方向。

我想可能持续时间类需要更长的时间,因为我一直在为功能添加越来越多的代码。所以我真正希望做的是在其他运行的类和方法中找到正确的时间,如果可能的话。

【问题讨论】:

  • 查看您的 startend 时间戳,它们 相隔 6 秒(第二部分是 32 和 38),因此计算是正确的。您应该检查如何进行开始和结束测量。
  • 欢迎来到 Stack Overflow。请通过tour 了解 Stack Overflow 的工作原理,并阅读How to Ask 以了解如何提高问题的质量。然后edit你的问题包含你的源代码作为工作minimal reproducible example,可以被其他人编译和测试。

标签: java events duration keyevent milliseconds


【解决方案1】:

方法keyReleased实际上是在方法keyTyped之后调用的。

在我所有的实验中,在 Windows 10 上使用 JDK 17.0.1,我无法在方法 keyReleased 中成功记录时间。因此,我在方法keyTyped 中记录了结束时间。方法keyTypedKeyEvent 参数有一个getWhen 方法,以毫秒为单位记录按键的时间。 (参考java.lang.System类中的方法currentTimeMillis

因此,为了获得持续时间,我在方法 keyTyped 中调用 System.currentTimeMillis 并从类 java.awt.event.KeyEvent 的方法 getWhen 返回的值中减去该值

@Override // java.awt.event.KeyListener
public void keyTyped(KeyEvent e) {
    long end = System.currentTimeMillis();
    long start = e.getWhen();
    System.out.println("start: " + start);
    System.out.println("  end: " + end);
    System.out.println((end - start) / 1_000.0d);
}

样本输出。

start: 1642245033174
  end: 1642245033175
0.001

【讨论】:

  • 这是否适用于后台运行的其他类和线程?并且在使用 keyTyped 方法时,如何区分按下之间的放下和抬起手指?
  • @bds 这是否适用于在后台运行的其他类和线程? 找出答案的一种方法。
  • @bds 我如何区分按下和抬起手指?我不明白这个问题。计算机不知道您移动了手指。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-05-11
  • 1970-01-01
  • 2016-12-08
  • 2015-06-07
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多