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