我有一个JFrame
具有多个面板的面板,这些面板累积在一个相当复杂的 Swing UI 中。我想添加键盘支持,以便无论组件焦点如何,某个按键,例如 [ENTER] 键,都会导致听众做出反应。
我尝试添加一个KeyListener
,但如果选择了另一个改变焦点的JFrame
,那将不起作用。JComponent
有没有合适的方法来做到这一点?
我有一个JFrame
具有多个面板的面板,这些面板累积在一个相当复杂的 Swing UI 中。我想添加键盘支持,以便无论组件焦点如何,某个按键,例如 [ENTER] 键,都会导致听众做出反应。
我尝试添加一个KeyListener
,但如果选择了另一个改变焦点的JFrame
,那将不起作用。JComponent
有没有合适的方法来做到这一点?
向 KeyboardFocusManager 注册 KeyEventDispatcher 允许您在所有键事件发送到焦点组件之前查看它们。您甚至可以修改事件或阻止它被传递到焦点组件:
KeyboardFocusManager.getCurrentKeyboardFocusManager().addKeyEventDispatcher(
new KeyEventDispatcher() {
public boolean dispatchKeyEvent(KeyEvent e) {
//Get the char which was pressed from the KeyEvent:
e.getKeyChar();
//Return 'true' if you want to discard the event.
return false;
}
});
如果您只想获取一个窗口/组件或特定键的键输入,则可以按照 kleopatra 的建议使用 KeyBindings。作为一个关于如何在按下 Enter 时注册到键盘事件的示例(您可以使用 KeyEvent 提供的任何 VK_,对于修饰符 [alt、ctrl 等],请参见 InputEvent),请参见:
JFrame frame = new JFrame(); //e.g.
JPanel content = (JPanel)frame.getContentPane();
content.getInputMap().put(KeyStroke.getKeyStroke(java.awt.event.KeyEvent.VK_ENTER,0),"enterDown");
content.getActionMap().put("enterDown",new AbstractAction() {
private static final long serialVersionUID = 1l;
@Override public void actionPerformed(ActionEvent e) {
//This action is called, as the Enter-key was pressed.
}
});
我这样做的方法是使 JFrame 可聚焦并将侦听器附加到它。然后,遍历所有的 JFrame 子级并使其他所有内容都无法聚焦。当然,这仅在您没有文本框或类似内容的情况下才有效,因为它们将变得不可编辑。