I'm writing a game in Java, right now it's Swing + JOGL - a JFrame with a GLCanvas.
I handle input using keyPressed
etc. events (jframe.addKeyListener(...)
) and it doesn't seem to work properly:
when I have 3+ keys down at the same time, they don't register properly- apparently this is keyboard's fault, I have to find an alternate control scheme.- after the window loses, then regains focus, input stops working completely...
What am I doing wrong?
Is there a better way of handling keyboard input in Java?
(I'd rather not switch to another library, like LWJGL... unless I have no choice).
Some of the tips in this article on global event listeners include catching key events with the
KeyboardFocusManager
, and might help with coming back from losing focus.Regarding the 3+ keys, that's going to be tricky since the
KeyEvent
accounts for modifiers but not for multiple (regular) keys in its API. You might have to manage the press state yourself, in that if you get a KEY_PRESSED you store that key and build up the set of keys that are currently pressed. But if you simply don't get events at all when 3 or more keys are pressed, I'm not sure there's much you can do.Edit: Also, the JGame library has a JOGL target. Looking at how it handles key events might help. I know it can handle at least 2 keys simultaneously.
To keep dependencies down, I would go for the "built-in" keyboard handling. It works just fine if you know what your doing. I'll paste some code from my games:
It handles key-repeats with custom repeat-delay / rate and has no issues with in which component keyboard focus lies.