Swing: Установка функциональной клавиши (F2) как акселератор

Я имею пункт меню, "переименовываю", для которого 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); 
7
задан Itay Maman 7 January 2010 в 10:49
поделиться

1 ответ

Это, вероятно, происходит потому, что 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 для ваших пунктов меню, вместо того, чтобы создавать их "с нуля". Помимо очень простого кода настройки меню, вы можете использовать один и тот же экземпляр действия как для главного меню, так и для всплывающей/всплывающей панели, а также включать/выключать их оба одновременно.

.
4
ответ дан 7 December 2019 в 03:15
поделиться
Другие вопросы по тегам:

Похожие вопросы: