Swing: установка функциональной клавиши (F2) в качестве ускорителя - PullRequest
7 голосов
/ 07 января 2010

У меня есть пункт меню «переименовать», для которого F2 установлен как ускоритель. Действительно, когда отображается меню, рядом с «переименованием» появляется небольшая индикация «F2».

К сожалению, это не работает. Этот ускоритель не вызывает ответа. Когда я меняю акселератор на CTRL + F2 - все работает.

Кажется, я должен использовать InpoutMpa / ActionMap. Проблема в том, что я хочу, чтобы это работало повсюду в приложении, поэтому я пытаюсь связать его с JFrame верхнего уровня. Но JFrame не имеет метода getInputMap ().

Проиграл.

[Добавлено]

     ks = KeyStroke.getKeyStroke(KeyEvent.VK_F2, 0);
     JMenuItem mi = new JMenuItem("Rename");
     mi.setAccelerator(ks);
     mi.addActionListener(action); 

Ответы [ 2 ]

5 голосов
/ 18 января 2012

Я знаю, что это старая ветка, но я боролся с тем же, что и оригинальный постер, и нашел решение. Сам JFrame не имеет метода getInputMap, но его корневая панель имеет. Так что вместо этого вы должны использовать «getRootPane.getInputMap».

Пример кода:

public class ApplicationFrame extends JFrame {
    private AbstractAction f2Action = new AbstractAction() {
        private static final long serialVersionUID = 1L;

        public void actionPerformed(ActionEvent e) {
            // Do something useful
        }
    };

    public ApplicationFrame() {

        InputMap inputMap = getRootPane().getInputMap(JComponent.WHEN_IN_FOCUSED_WINDOW);
        ActionMap actionMap = getRootPane().getActionMap(); 

        inputMap.put(KeyStroke.getKeyStroke("F2"), "f2Action");
        actionMap.put("f2Action", f2Action);

    }
}
4 голосов
/ 07 января 2010

Вероятно, это происходит потому, что JTable использует F2 для вызова действия StartEditing (я видел такое же поведение в одной из моих программ и проследил его до этого).

Есть несколько решений. Наиболее радикальным является удаление этого сопоставления ввода (я считаю, что этот код фактически удаляет сопоставление из всех JTables):

KeyStroke keyToRemove = KeyStroke.getKeyStroke(KeyEvent.VK_F2, 0);

InputMap imap = table.getInputMap(JComponent.WHEN_ANCESTOR_OF_FOCUSED_COMPONENT);
while (imap != null)
{
    imap.remove(keyToRemove);
    imap = imap.getParent();
}

Или, если вы используете таблицу только для отображения и не планируете позволить пользователю редактировать ее, вы можете сделать ее не фокусируемой:

table.setFocusable(false);

По совершенно другой теме, я настоятельно рекомендую создать подкласс AbstractAction для элементов меню, а не создавать их "с нуля". Помимо предоставления очень простого кода настройки меню, вы можете использовать один и тот же экземпляр действия как для главного меню, так и для всплывающей панели / панели инструментов, а также включать / отключать их одновременно.

...