相关疑难解决方法(0)

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

(为清晰起见编辑)

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

要求:

  1. 当用户按下某个键时,我想知道它是什么键;
  2. 当用户释放一些密钥时,我想知道它是什么密钥;
  3. 我想忽略系统自动重复选项:我希望每次按键只接收一个按键事件,每个按键释放只需一个按键释放事件;
  4. 如果可能的话,我会使用第1至第3项来知道用户是否一次持有多个键(即,她点击'a'并且没有释放它,她点击"Enter").

我在Java中面临的问题是,在Linux下,当用户持有一些密钥时,有许多keyPress和keyRelease事件被触发(因为键盘重复功能).

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

  1. 获取关键事件的最后一次发生 - 在Linux中,对于密钥重复它们似乎为零,但是,在Mac OS中它们不是;
  2. 仅当当前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());
}

}
Run Code Online (Sandbox Code Playgroud)

当用户持有密钥(即"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: …
Run Code Online (Sandbox Code Playgroud)

java swing keypress autorepeat keyrelease

18
推荐指数
2
解决办法
2万
查看次数

标签 统计

autorepeat ×1

java ×1

keypress ×1

keyrelease ×1

swing ×1