Java KeyListener keyPressed方法触发太快

如果你使用java KeyListener类,你知道如果按住一个键keyPressed将触发一个KeyEvent ,然后大约半秒后将非常快地多次触发相同的键。 我想知道是否有办法防止KeyEvents射击太快。 我希望它们以大约每500毫秒一次的恒定速率运行。

你可以,但诀窍是不要减慢事件的触发速度,但要减慢你处理它们的速度:

 KeyListener kl = new KeyListener() { private long lastPressProcessed = 0; @Override public void keyPressed(KeyEvent e) { if(System.currentTimeMillis() - lastPressProcessed > 500) { //Do your work here... lastPressProcessed = System.currentTimeMillis(); } } @Override public void keyTyped(KeyEvent e) {} @Override public void keyReleased(KeyEvent e) { } }; 

不,这完全取决于系统。 你必须要监听keyPressed事件,自己启动一个以固定速率触发事件的计时器,并在下一个keyReleased事件中停止它。

尝试这样的事情:

 component.addKeyListener(new KeyListener() { Timer t = new Timer(); TimerTask tt; @Override public void keyTyped(KeyEvent e) { } @Override public void keyReleased(KeyEvent e) { tt.cancel(); tt = null; } @Override public void keyPressed(KeyEvent e) { if (tt != null) return; tt = new TimerTask() { @Override public void run() { System.out.println(System.currentTimeMillis() % 1000); } }; t.scheduleAtFixedRate(tt, 0, 500); } }); 

这由您的操作系统控制。 但是你可以很容易地让你的处理程序检查它自上次触发和相应响应以来的时间。

通常,密钥的自动重复率由系统设置; 我不知道它是否可以在Java中改变。 但是,您可以使用事件到达时间,直到最后一次响应后500ms(或在键释放后,应该为快速键入的用户清除计时器)直到500秒。