Java KeyListener keyPressed method fires too fast
If you use the java KeyListener
class you know that if you hold down a key keyPr开发者_开发问答essed
will fire one KeyEvent
, and then about half a second later will fire the same key many times very very fast. I would like to know if there is a way to keep the KeyEvents
from firing too fast. I would like them to be at a nice constant rate of about once every 500 ms.
You can, but the trick is to not slow down the firing of events, but to slow down how fast you process them:
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) { }
};
No, this is completely system dependent. You would have to listen for keyPressed
events, start a timer on your own that fires events at a fixed rate and stop it at the next keyReleased
event.
Try something like this:
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);
}
});
This is controlled by your OS. But you could easily have your handler check how long it is since the last time it fired and respond accordingly.
Usually the auto-repeat rate for keys is set by the system; I don't know if it's changeable from within Java. However, you can use the event arrival time to not react to one until 500ms after the last time you reacted (or after a key release, which should clear the timer for users who type fast).
精彩评论