如何知道用户何时真正发布了Java中的关键? - 代码日志

如何知道用户何时真正发布了Java中的关键?

(为清楚起见)

我想检测用户何时在Java Swing中按下并释放键,忽略键盘自动重复功能。我也希望纯Java方法在Linux,Mac OS和Windows上的工作。

要求:

>当用户按一些键时,我想知道这是什么关键;
>当用户释放一些键时,我想知道这是什么关键;
>我想忽略系统自动重复选项:我想要为每个按键只收到一个按键事件,并且每个键释放只需一个键释放事件;
>如果可能,我会使用项目1到3来知道用户一次是否持有多个键(即,她点击“a”而不释放它,她点击“Enter”)。

我在Java中遇到的问题是在Linux下,当用户拥有一些密钥时,会发出许多keyPress和keyRelease事件(由于键盘重复功能)。

我尝试了一些没有成功的方法:

>最后一次发生关键事件 – 在Linux中,关键重复似乎为零,但是在Mac OS中,它们不是;
>仅当当前keyCode与最后一个keyCode不同时才考虑一个​​事件 – 这样用户不能在同一个键中打两次;

这是代码的基本(非工作)部分:

import java.awt.event.KeyListener;

public class Example implements KeyListener {

public void keyTyped(KeyEvent e) {
}

public void keyPressed(KeyEvent e) {
    System.out.println("KeyPressed: "+e.getKeyCode()+", ts="+e.getWhen());
}

public void keyReleased(KeyEvent e) {
    System.out.println("KeyReleased: "+e.getKeyCode()+", ts="+e.getWhen());
}

}

当用户持有键(即’p’)时,系统显示:

KeyPressed:  80, ts=1253637271673
KeyReleased: 80, ts=1253637271923
KeyPressed:  80, ts=1253637271923
KeyReleased: 80, ts=1253637271956
KeyPressed:  80, ts=1253637271956
KeyReleased: 80, ts=1253637271990
KeyPressed:  80, ts=1253637271990
KeyReleased: 80, ts=1253637272023
KeyPressed:  80, ts=1253637272023
...

至少在Linux下,当一个密钥保持时,JVM将不断重新发送所有的关键事件。为了使事情更加困难,在我的系统(Kubuntu 9.04 Core 2 Duo)上,时间戳不断变化。 JVM发送一个关键的新版本和新的按键与相同的时间戳。这使得很难知道钥匙何时真正被释放。

有任何想法吗?

谢谢

这可能是有问题的。我不记得了(已经很久了),但是重复键功能(由底层操作系统而不是Java处理)很有可能没有为JVM开发人员提供足够的信息来区分这些附加功能“真实”的关键事件。 (我在这个OS / 2 AWT的工作在1.1.x中的方式)。

从KeyEvent的javadoc:

“Key pressed” and “key released” events are lower-level and depend on the platform and keyboard layout. They are generated whenever a key is pressed or released, and are the only way to find out about keys that don’t generate character input (e.g., action keys, modifier keys, etc.). The key being pressed or released is indicated by the getKeyCode method, which returns a virtual key code.

我记得在OS / 2中(当时还只有Windows XP的旧版本的键盘处理只有两个事件的上升/下降的风格),而不是3-event up / down / char现代版本),我没有报告KeyReleased事件的方式不同,如果关键只是被压制,事件自动生成;但我怀疑OS / 2甚至没有向我报告信息(不能记得肯定)。我们使用Sun的Windows参考JVM作为开发我们的AWT的指南 – 所以我怀疑是否有可能在这里报告这些信息,至少我们至少可以看到它。

http://stackoverflow.com/questions/1457071/how-to-know-when-a-user-has-really-released-a-key-in-java

本站文章除注明转载外,均为本站原创或编译
转载请明显位置注明出处:如何知道用户何时真正发布了Java中的关键?