Mark
Mark

Reputation: 21

Java KeyListener keyPressed method fires too fast

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.

Upvotes: 2

Views: 13963

Answers (4)

aioobe
aioobe

Reputation: 421290

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);
    }
});

Upvotes: 3

Matthew Gilliard
Matthew Gilliard

Reputation: 9498

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.

Upvotes: 2

user473395
user473395

Reputation:

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) {   }

};

Upvotes: 7

Ted Hopp
Ted Hopp

Reputation: 234857

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).

Upvotes: 1

Related Questions