Как мне обработать несколько нажатий клавиш в одном и том же методе actionPerformed прослушивателя действий в Java Swing? - PullRequest
0 голосов
/ 06 ноября 2019

Поняв, как обрабатывать события клавиш уровня окна ( Как получить событие ключа в экземпляре Java Swing JFrame, который имеет много JTextFields? ), я хотел бы определить один класс, который может бытьприсоединяется через:

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);
        }


    }

}

1 Ответ

2 голосов
/ 06 ноября 2019

Я только что просмотрел несколько проектов и нашел пример, в котором я использовал InputMap и ActionMap для хранения нажатий клавиш и их соответствующих действий;

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().

...