log_0
log_0

Reputation: 878

Java: Add KeyListener to JFrame and its components

I try to add a KeyListener to a JFrame. This works fine like this.

JFrame frame = new JFrame();
[...]
frame.addKeyListener(new KeyListener() { [...] });

However, when I have the focus on a button or on a JTextField (like when I click on it), that KeyListener won't react to my button pushes.

Do you know how to fix this?

Upvotes: 1

Views: 943

Answers (1)

Hovercraft Full Of Eels
Hovercraft Full Of Eels

Reputation: 285460

Do you know how to fix this?

Yes, use Key Bindings and not a KeyListener. The bindings can be set to work even if the bound component doesn't have the focus, one of their key advantages (no pun intended). The tutorial can be found here: Key Bindings Tutorial.

Note that when you get the InputMap from your bound component, be sure to use the right condition, i.e.,

InputMap inputMap = myComponent.getInputMap(JComponent.WHEN_IN_FOCUSED_WINDOW);

There are three input maps for each component, and the one above will be active when the component is held in a top-level window (such as a JFrame) that is currently active. This means that the binding will work even if the component itself doesn't have focus.


You can find some of my sample programs that use Key Bindings, often in conjunction with Swing animation, here:

Upvotes: 3

Related Questions