Swing: глобальные сочетания клавиш

Таким образом, текстовые компоненты Swing предоставляют возможность использовать глобальные сочетания клавиш. JTextComponent.getKeyMap(JTextComponent.DEFAULT_KEYMAP) предоставляет способ изменить глобальную раскладку клавиш по умолчанию, унаследованную всеми текстовыми компонентами Swing. Но есть ли у других компонентов возможность глобально устанавливать привязки клавиш?

Причина, по которой я спрашиваю об этом, заключается в том, что на работе у нас есть устаревшее приложение Swing, над которым мы работаем, и есть поведение, довольно стандартное для других приложений, которого у нас просто нет в нем. Например, такие вещи, как нажатие клавиши ESC, чтобы закрыть диалоговое окно. Хотя я мог бы просмотреть всю кодовую базу, найти каждый экземпляр диалогового окна и добавить это поведение, было бы неплохо иметь возможность глобально добавлять привязки клавиш к компонентам.

В идеале это глобальное поведение можно было бы применять к определенным классам (например, некоторые к JDialog, некоторые к JFrame и т. д.), но если оно должно быть на 100% глобальным, это нормально.

Есть идеи?


person user2223059    schedule 16.03.2016    source источник


Ответы (1)


Каждый компонент Swing имеет InputMap, который используется всеми компонентами того же типа. Изменения этого InputMap повлияют на все компоненты.

Например, все JTextAreas делят focusInputMap. Чтобы отключить возможность выделения всего текста с помощью Control-A, вы можете использовать такой код:

InputMap im = (InputMap) UIManager.get("TextArea.focusInputMap");
KeyStroke keyStroke = KeyStroke.getKeyStroke("control A");
im.put(keyStroke, "none"); 

Вы можете проверить значения UIManager по умолчанию, чтобы узнать, какие InputMaps реализованы для данный компонент Swing.

Frame и Dialog не отображаются в UIManager, поэтому я не знаю, поддерживаются ли для них InputMaps или нет. Вы можете попробовать добавить «Dialog.ancestorInputMap» и создать свои собственные привязки, чтобы увидеть, работает ли это.

В противном случае вы можете попробовать использовать «RootPane.ancestorInputMap», хотя я предполагаю, что эта InputMap будет совместно использоваться фреймами и диалогами.

Вы также можете проверить клавишу Escape и диалоговое окно для Action, привязанный к InputMap объекта JRootPane.

person camickr    schedule 16.03.2016