Java KeyListener keyPressed方法激发得太快
如果使用javaJava KeyListener keyPressed方法激发得太快,java,swing,keylistener,keyevent,Java,Swing,Keylistener,Keyevent,如果使用javaKeyListener类,您就会知道,如果按住一个键keyPressed,将触发一个KeyEvent,然后大约半秒钟后,将以非常快的速度多次触发同一个键。我想知道是否有办法防止KeyEvents触发过快。我希望它们保持一个很好的恒定速率,大约每500毫秒一次。通常按键的自动重复速率由系统设置;我不知道它是否可以从Java内部更改。但是,您可以使用事件到达时间对事件不作出反应,直到您最后一次作出反应后500毫秒(或按键释放后,这将清除快速键入的用户的计时器)。您可以这样做,但诀窍是
KeyListener
类,您就会知道,如果按住一个键keyPressed
,将触发一个KeyEvent
,然后大约半秒钟后,将以非常快的速度多次触发同一个键。我想知道是否有办法防止KeyEvents
触发过快。我希望它们保持一个很好的恒定速率,大约每500毫秒一次。通常按键的自动重复速率由系统设置;我不知道它是否可以从Java内部更改。但是,您可以使用事件到达时间对事件不作出反应,直到您最后一次作出反应后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) { }
};
不,这完全取决于系统。您必须监听
按键
事件,启动一个以固定速率触发事件的计时器,并在下一个按键释放
事件时停止
试着这样做:
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);
}
});
这是由您的操作系统控制的。但是,您可以很容易地让您的处理程序检查它距离上次触发有多长时间,并做出相应的响应。只有在系统键重复非常快的情况下,这项功能才能正常工作。如果两次按压之间的间隔是400毫秒,那么这可能会导致高达900毫秒的延迟。@aioobe-我认为,除了改变系统自动回复速率之外,没有其他方法可以解决这个问题。这是欠采样的一个性质;将出现别名,这将显示为一个抖动的重复时间。如果您正在处理长流的自动重放事件,那么可以应用抗锯齿技术来减少抖动,但我怀疑长流的自动重放事件是否是常见的应用程序。