Всплывающее поле со списком и выбор с помощью сочетаний клавиш

   public static void comboBoxActionPerform(JComboBox  comboBox)
    {
        String ACTION_KEY = "myAction";

        Action actionListener = new AbstractAction()
        {   
            @Override
            public void actionPerformed(ActionEvent actionEvent)
            {
                JComboBox source = (JComboBox) actionEvent.getSource();
                source.showPopup();
                source.setFocusable(true);
            }
        };

        KeyStroke ctrlT = KeyStroke.getKeyStroke(KeyEvent.VK_L, InputEvent.CTRL_MASK);
        InputMap inputMap = comboBox.getInputMap(JComponent.WHEN_IN_FOCUSED_WINDOW);
        inputMap.put(ctrlT, ACTION_KEY);
        ActionMap actionMap = comboBox.getActionMap();
        actionMap.put(ACTION_KEY, actionListener);
        locationTypeComboBox.setActionMap(actionMap);
    }

У меня есть поле со списком, и я вызываю описанный выше метод для всплывающего окна со списком при нажатии клавиш (Ctrl + L). Это всплывает поле со списком. Но я не могу выбрать элементы в нем с помощью клавиш ВВЕРХ/ВНИЗ. Поле со списком не сфокусировано, когда я нажимаю Ctrl + L. Это может быть проблемой, которую нужно исправить. Если я выбираю поле со списком вручную, а затем вверх/вниз работает нормально. Нужна ваша помощь.


person Anuruddha    schedule 11.09.2012    source источник


Ответы (1)


Метод, который вы ищете, это requestFocus, а не setFocusable

    Action actionListener = new AbstractAction() {
        @Override
        public void actionPerformed(ActionEvent actionEvent) {
            JComboBox source = (JComboBox) actionEvent.getSource();
            source.requestFocus();
            source.showPopup();
            // source.setFocusable(true);
        }
    };

Кстати, необычно сбрасывать actionMap компонента.

person kleopatra    schedule 11.09.2012
comment
нет, не работает в Java6 на WinXP, на 1-м key_down или key_up, 2-й работает - person mKorbel; 11.09.2012
comment
workforme (jdk7, win7 - но это не должно иметь большого значения) - попробуйте обернуть showPopup в invokeLater. - person kleopatra; 11.09.2012
comment
согласен +1 за стерильное решение с одним fucusable JCOmponent, тогда работает, но lossFocus в случае, если есть fosusable JComponents, просто ради интереса попробовать изменить WHEN_FOCUSED на WHEN_IN_FOCUSED_WINDOW, тогда только 1.st JComboBox реагирует на KeyEvents :-), странноееее , забавно и безумно для самого сложного графического интерфейса - person mKorbel; 11.09.2012