Search code examples
javaswingkey-bindingskey-events

Java: Keybind cooldowns?


I have a class extending jframe with a key binding mapped to an invisible button that does stuff. When I press the key on the keyboard, it executes the command of the button. However, if the user holds the button down, it will execute the command like a hundred times per second, crashing the program. How do I prevent this so that the command only executes... let's say... once per second when the key is pressed down?

Code snippets are as follows:

JButton fire = new JButton("");
KeyStroke spaceBar = KeyStroke.getKeyStroke("SPACE");
FireCommand fc = new FireCommand();
this.fire.setAction(fc);
imap.put(SpaceBar,"space");
amap.put("space",fc);

Solution

  • The solution, on a Windows environment is to have two bindings. One for keyPressed which starts a Timer that continually fires at whatever interval you wish and another for a keyReleased which stops the Timer.

    See the last example from Motion Using the Keyboard for a complete example.

    I'm not sure if this approach still works on a Mac, because I believe the order of events on a Mac is pressed, released, pressed, released.... when you hold the key down. So the starting/stopping of the Timer may not work as expected.