java - 向 Java Swing 应用程序添加键盘支持,无论焦点如何

标签 java swing event-handling keyboard keylistener

我有一个带有多个面板的 JFrame,这些面板累积在相当复杂的 Swing UI 中。我想添加键盘支持,以便无论组件聚焦于某个按键,例如 [ENTER] 键,都会导致监听器使用react。

我尝试将 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.
    }
});

关于java - 向 Java Swing 应用程序添加键盘支持,无论焦点如何,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13114668/

相关文章:

python - Python中的事件系统

vb.net - 如何阻止 WinForm 的 ALT+F4 但允许所有其他形式关闭 WinForm?

Java : String. 匹配()

Java JDialog 交互,无需关注 macOS

java - JTabbedPane 中具有相等(恒定)宽度的选项卡

java - GridLayout 上的 JButtons - MineSweeper

javascript - 尝试在屏幕上打印鼠标 x 和 y 位置 - 得到 0,0

java - 如何使用 SWIG 返回指向用户定义类对象的指针

java - 我可以让 Jenkins 每小时检查一次 SVN 是否有变化吗?

java - 如何在 Java 中打开和操作 Word 文档/模板?