Java: 为JFrame及其组件添加KeyListener
Java: Add KeyListener to JFrame and its components
我尝试将 KeyListener
添加到 JFrame
。这很好用。
JFrame frame = new JFrame();
[...]
frame.addKeyListener(new KeyListener() { [...] });
但是,当我将焦点放在按钮或 JTextField
上时(例如当我单击它时),KeyListener
不会对我的按钮按下做出反应。
你知道如何解决这个问题吗?
Do you know how to fix this?
是的,使用键绑定而不是 KeyListener
。即使绑定的组件没有焦点,绑定也可以设置为工作,这是它们的主要优势之一(没有双关语意)。该教程可在此处找到:Key Bindings Tutorial。
请注意,当您从绑定组件中获取 InputMap
时,请务必使用正确的条件,即
InputMap inputMap = myComponent.getInputMap(JComponent.WHEN_IN_FOCUSED_WINDOW);
每个组件有三个输入映射,当组件位于当前处于活动状态的顶级window(例如JFrame
)中时,上面的那个将处于活动状态.这意味着即使组件本身没有焦点,绑定也会起作用。
您可以在此处找到我的一些使用键绑定的示例程序,通常与 Swing 动画结合使用:
- Java Animate JLabel
- MouseEntered and KeyPressed at Same Time Java Swing
- Override VK_Tab Focus action
- How to make an image move while listening to a keypress in Java.
- Java Key Event won't execute once I press a button
- Did I structure this key listener properly?
我尝试将 KeyListener
添加到 JFrame
。这很好用。
JFrame frame = new JFrame();
[...]
frame.addKeyListener(new KeyListener() { [...] });
但是,当我将焦点放在按钮或 JTextField
上时(例如当我单击它时),KeyListener
不会对我的按钮按下做出反应。
你知道如何解决这个问题吗?
Do you know how to fix this?
是的,使用键绑定而不是 KeyListener
。即使绑定的组件没有焦点,绑定也可以设置为工作,这是它们的主要优势之一(没有双关语意)。该教程可在此处找到:Key Bindings Tutorial。
请注意,当您从绑定组件中获取 InputMap
时,请务必使用正确的条件,即
InputMap inputMap = myComponent.getInputMap(JComponent.WHEN_IN_FOCUSED_WINDOW);
每个组件有三个输入映射,当组件位于当前处于活动状态的顶级window(例如JFrame
)中时,上面的那个将处于活动状态.这意味着即使组件本身没有焦点,绑定也会起作用。
您可以在此处找到我的一些使用键绑定的示例程序,通常与 Swing 动画结合使用:
- Java Animate JLabel
- MouseEntered and KeyPressed at Same Time Java Swing
- Override VK_Tab Focus action
- How to make an image move while listening to a keypress in Java.
- Java Key Event won't execute once I press a button
- Did I structure this key listener properly?