Привязки ключей и прослушиватели ключей в Java
Я отмечаю, что в Java / Swing существует, по крайней мере, два разных способа обработки ключевых событий:
каковы преимущества / недостатки каждого из них, и когда вы должны предпочесть один, а не другой?
2 ответов
когда вы должны предпочесть один, а не другой?
предпочитаете комбинации клавиш, так как они были введены. А KeyListener
- Это соединение более низкого уровня с событиями.
эта страница для комбинации клавиш охватывает множество причин, по которым я хотел бы использовать их, а не KeyListener
. В нем перечислены многие вещи, которые просто "недоступны" для KeyListener
. Выбор Е. Г. из:
WHEN_FOCUSED
-
WHEN_ANCESTOR_OF_FOCUSED_COMPONENT
WHEN_IN_FOCUSED_WINDOW
чем больше я читаю связанный документ, тем меньше я могу понять необходимость задать вопрос. Е. Г.:
альтернативы клавиш с помощью ключа слушателей. Ключевые слушатели имеют свое место в качестве низкоуровневого интерфейса для ввода с клавиатуры, но для ответа на отдельные клавиши привязки клавиш более уместны и, как правило, приводят к более легко поддерживаемый код. Прослушиватели ключей также сложны, если привязка ключа должна быть активной, когда компонент не имеет фокуса. Некоторые из преимуществ Привязок ключей-они несколько самодокументированы, учитывают иерархию сдерживания, поощряют многоразовые куски кода (
Action
объекты) и позволяют легко удалять, настраивать или совместно использовать действия. Кроме того, они позволяют легко изменить ключ, к которому привязано действие. Еще одно преимуществоActions
это то, что у них есть включено состояние, которое обеспечивает простой способ отключить действие без необходимости отслеживать, к какому компоненту оно прикреплено.
текстовые компоненты
как отметил @Robin, текстовые компоненты также имеют DocumentListener
& DocumentFilter
который может быть добавлен для функциональности, более подходящей для текстовых документов. См. Функции Текстовых Компонентов для получения дополнительной информации о документе слушатель & фильтры.
- привязки клавиш (высокая абстракция)
преимущества
настраиваемые, разделяемых,
предназначен для простых ярлыков, без побочных эффектов un_wanted (большинство из этих событий довольно просты и настраиваются)
confortly решение любой проблемы с фокусом в окне (Настройка тоже, конечно, в Java окно должно иметь фокус на экране)
качели внутренне чтобы использовать привязки клавиш, ярлыки built_in, действия, больше в привязки клавиш @camickr (в Swing реализованы интересные ярлыки и действия)
выход должен быть к действию качания (такая же высокая возможная абстракция в качании)
недостатки
невозможно переопределить все клавиши с клавиатуры
невозможно переопределить три или более клавиш нажаты в в то же время
код выглядит как очень сложный (не правда, код сортировщик в большинстве случаев по сравнению с тем же кодом из KeyListener)
удалено для более подробной информации, чтобы увидеть commnent @camickr (требуется таймер качания для повторных действий)
невозможно использовать () с одним методом, реализованным в API
.
KeyListeners (низкий уровень слушатель)
преимущества
очень проста в использовании, интуитивно понятный
код очень короткий для одного двух ключевых событий
не требуется никаких знаний о Swing, Java
можно переопределить дерево или нажать несколько клавиш (например), для очень сложных keyshortcuts, тогда не имеет значения, какой из них может запускать любые отдельные ключевые события
is возможно программно к событию.consume ()
возможно прослушивание non_finalized, внутренних событий из составных JComponents (JComboBox, JSpinner ...)
недостатки
не доступно для части контейнеров и JComponents
(J)компонент должен быть владельцем фокуса и должен быть focusable
не предназначен для компонентов Swing J
.
AWTEventListener
чтобы объединить все события ключа и мыши, прослушиватель низкого уровня, как это возможно в Java
в основном нет причин использовать этот слушатель для большинства (даже очень сложных) GUI на основе Swing
Я вижу, что этот прослушиватель реализован в пользовательских компонентах на основе AWT необходимых сверстников пришел из native OS
но есть отличные реализации для AWTEventListener бездействие приложения и глобальные прослушиватели событий @camickr
.
Примечание: заказ ключевых событий-это разные платформы по платформам