问题
If you use the java KeyListener
class you know that if you hold down a key keyPressed
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.
回答1:
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) { }
};
回答2:
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);
}
});
回答3:
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.
回答4:
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).
来源:https://stackoverflow.com/questions/5199581/java-keylistener-keypressed-method-fires-too-fast