首页 > 解决方案 > 如何在 Java Swing 中的 Action Listener 的同一 actionPerformed 方法中处理多个 KeyStroke?

问题描述

在了解了如何处理窗口级键事件(如何在具有许多 JTextField 的 Java Swing JFrame 实例中获取键事件?)之后,我想定义一个可以通过以下方式附加的类:

frame.getRootPane ().registerKeyboardAction ( ... );

该类包含在下面,它打算在主窗口和所有子窗口中使用。这个想法是,无论您是在主窗口中还是在其中一个子窗口中,Fx 键都将单独显示/隐藏子窗口(即,所有应用程序都将以相同的方式响应 Fx 键击)。构造函数包括当前窗口和包含所有窗口的主窗口。

我的问题是我不知道如何识别方法中按下了哪个键actionPerformed。欢迎任何有关如何识别KeyStroke.getKeyStroke(KeyEvent.VK_Fxx,0)触发 actionPerformed 的提示。

public class ApplicationLevelKeys implements ActionListener {

    private MainWindow mainWindow;

    public ApplicationLevelKeys(JFrame frame, MainWindow mw) {
        mainWindow = mw;
        frame.getRootPane().registerKeyboardAction(this, KeyStroke.getKeyStroke(KeyEvent.VK_F2,0), JComponent.WHEN_IN_FOCUSED_WINDOW);
        frame.getRootPane().registerKeyboardAction(this, KeyStroke.getKeyStroke(KeyEvent.VK_F12,0), JComponent.WHEN_IN_FOCUSED_WINDOW);
    }

    @Override
    public void actionPerformed(final ActionEvent e) {

        // F12 - Display Attribute Window
        System.out.println("F12");
        if(mainWindow.propertiesWindow.isVisible()) {
            mainWindow.propertiesWindow.setVisible(false);
        } else {
            mainWindow.propertiesWindow.setVisible(true);
        }

        // F2 - Display Period Window
        System.out.println("F2");
        if(mainWindowperiodWindow.isVisible()) {
            mainWindow.periodWindow.setVisible(false);
        } else {
            mainWindow.periodWindow.setVisible(true);
        }


    }

}

标签: javaswingactionlistenerkeystrokeactionevent

解决方案


我刚刚浏览了一些项目,发现了一个使用 anInputMap和 anActionMap来存储 KeyStroke 及其相应操作的示例;

private void initKeyBindings(final JComponent c)
    {
        final InputMap iMap = c.getInputMap(JComponent.WHEN_IN_FOCUSED_WINDOW);
        final ActionMap aMap = c.getActionMap();
        String key;
        key = "f1";
        iMap.put(KeyStroke.getKeyStroke(KeyEvent.VK_F1, 0), key);
        aMap.put(key, showHelpAction);

        key = "f2";
        iMap.put(KeyStroke.getKeyStroke(KeyEvent.VK_F2, 0), key);
        aMap.put(key, saveTableAction);

        key = "f5";
        iMap.put(KeyStroke.getKeyStroke(KeyEvent.VK_F5, 0), key);
        aMap.put(key, loadTableAction);

        key = "f6";
        iMap.put(KeyStroke.getKeyStroke(KeyEvent.VK_F6, 0), key);
        aMap.put(key, focusDefaultCommandsAction);

        key = "f7";
        iMap.put(KeyStroke.getKeyStroke(KeyEvent.VK_F7, 0), key);
        aMap.put(key, focusProtocolCommandsAction);

        key = "f11";
        iMap.put(KeyStroke.getKeyStroke(KeyEvent.VK_F11, 0), key);
        aMap.put(key, loadDokuFilesAction);

        key = "f12";
        iMap.put(KeyStroke.getKeyStroke(KeyEvent.VK_F12, 0), key);
        aMap.put(key, startSignalplanAction);

        key = "Ctrl+R";
        iMap.put(KeyStroke.getKeyStroke(KeyEvent.VK_R, InputEvent.CTRL_DOWN_MASK), key);
        aMap.put(key, openRevisorAction);

    }

在您的actionPerformed()方法中,您现在可以遍历aMap并与aMap.getKey()您按下的键进行比较,然后通过aMap.getValue().


推荐阅读