如何使应用程序中的所有组件响应特定的键事件?

时间:2011-01-28 13:49:43

标签: java swing key-bindings keylistener

我的意思是,就像在网络浏览器中按'F5'一样,无论焦点在哪里,都会刷新网页。我如何使用GUI应用程序在Java中执行此操作?我可以对所有组件执行'addKeylistener',但我确信这不是正确的方法。

4 个答案:

答案 0 :(得分:7)

您可以使用Swing的输入和动作映射机制:

component.getRootPane().getInputMap(JRootPane.WHEN_IN_FOCUSED_WINDOW)
          .put(KeyStroke.getKeyStroke(KeyEvent.VK_F5, 0), "refresh");
component.getRootPane().getActionMap().put("refresh", new AbstractAction() {
    @Override
    public void actionPerformed(ActionEvent e) {
        // Code here
    }
});

答案 1 :(得分:3)

此类任务的最佳解决方案是将听众注册到标准KeyboardFocusManager,就像我最近在this answer中解释的那样。

答案 2 :(得分:2)

另一个选择是为您的应用程序使用菜单栏。然后刷新只是菜单上的菜单项,您可以将F5指定为菜单项的加速器。在幕后,它将为您进行键绑定。

这是一个很好的方法,因为现在你有了一个自我管理的GUI。用户可以通过在菜单中搜索各种选项来调用刷新。高级用户最终将学习加速键,甚至不使用鼠标。与所有GUI设计一样,您应该能够使用键盘或鼠标调用函数。

答案 3 :(得分:1)

您可以在java.awt.Toolkit

中添加AWTEventListener
    AWTEventListener listener = new AWTEventListener() {            
        @Override
        public void eventDispatched(AWTEvent ev) {
            if (ev instanceof KeyEvent) {
                KeyEvent key = (KeyEvent) ev;
                if (key.getID() == KeyEvent.KEY_PRESSED && KeyEvent.getKeyText(key.getKeyCode()).equals("F5")) {
                    System.out.println(ev);
                    // TODO something meaningfull
                    key.consume();
                }
            }
        }
    };

    Toolkit.getDefaultToolkit().addAWTEventListener(listener, AWTEvent.KEY_EVENT_MASK);