Передача нажатий клавиш ускорителя в главное меню в Java

Я добавил несколько ускорителей в главное меню, используя MenuItem.setAccelerator(). Просто основные вещи, такие как ctrl-c для копирования и т. д.

Это работает нормально. Но приложение немного похоже на IDE, оно имеет несколько панелей, содержащих JTables. Если ячейка таблицы имеет фокус, она поглощает клавишу быстрого доступа, что означает, что главное меню ее никогда не увидит.

Понятно, что если редактируемая ячейка таблицы активна, я бы хотел, чтобы клавиши вырезания и вставки работали нормально, но в любом другом случае я хотел бы, чтобы главное меню реагировало.

Есть идеи?


person Martin McBride    schedule 15.02.2011    source источник
comment
Ctrl+C — это привязка по умолчанию для JTable, которая копирует данные строки в буфер обмена, поэтому ускоритель меню не должен вызываться.   -  person camickr    schedule 16.02.2011
comment
Возможно, я должен был сказать, что панели представляют собой листы свойств, технически JTable, но не обязательно рассматриваемые пользователем как таковые. Извините, я не был ясен. Когда пользователь выбирает строку на странице свойств и нажимает Ctrl+C, он, скорее всего, ожидает, что произойдет копирование главного меню. Итак, я думаю, я пытаюсь переопределить поведение JTables по умолчанию.   -  person Martin McBride    schedule 16.02.2011


Ответы (2)


KeyStrokes переходят к компоненту, который сначала имеет фокус. Поскольку JTable привязывает Ctrl+C к действию, вызывается это действие.

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

Прочтите раздел руководства по Swing Как использовать привязки клавиш. Он показывает вам, как удалить привязку.

person camickr    schedule 15.02.2011

Спасибо, это навело меня на правильный путь.

Удаление привязок не совсем сработало, оно просто остановило таблицу, выполняющую действие по умолчанию, поэтому нажатие клавиши полностью игнорировалось.

Однако добавление этого в саму таблицу работало нормально:

    component.getInputMap().put(KeyStroke.getKeyStroke(KeyEvent.VK_C, ActionEvent.CTRL_MASK), "copy");
    component.getActionMap().put("copy", actions.copyAction);

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

person Martin McBride    schedule 16.02.2011