Ключевые привязки и ключевые слушатели в Java
Я отмечаю, что в Java/Swing, по-видимому, существует как минимум два разных способа обработки ключевых событий:
Каковы преимущества/недостатки каждого, и когда вы предпочитаете один, а не другой?
Ответы
Ответ 1
когда вы предпочитаете один, а не другой?
Применить ключевые привязки с момента их введения. A KeyListener
- это соединение нижнего уровня с событиями.
Эта страница привязки клавиш охватывает многие причины, по которым я бы использовал их, а не KeyListener
. В нем перечислены многие вещи, которые просто "недоступны" для KeyListener
. НАПРИМЕР. выбор:
-
WHEN_FOCUSED
-
WHEN_ANCESTOR_OF_FOCUSED_COMPONENT
-
WHEN_IN_FOCUSED_WINDOW
Чем больше я читаю связанный документ, тем меньше я могу понять необходимость задать вопрос. Например:.
Альтернативой привязке клавиш является использование прослушивателей клавиш. Ключевые слушатели имеют свое место в качестве низкоуровневого интерфейса для ввода с клавиатуры, но для ответа на отдельные клавиши привязки клавиш более подходят и, как правило, приводят к более легкому сохранению кода. Ключевым слушателям также сложно, если привязка клавиш должна быть активной, когда компонент не имеет фокуса. Некоторые из преимуществ привязок клавиш - это несколько самостоятельная документация, учет иерархии сдерживания, поощрение многократных фрагментов кода (Action
объектов) и позволяет легко удалять, настраивать или совместно использовать действия. Кроме того, они упрощают изменение ключа, к которому привязано действие. Другим преимуществом Actions
является то, что они имеют разрешенное состояние, которое обеспечивает простой способ отключить действие без необходимости отслеживать, к какому компоненту он подключен.
Текстовые компоненты
Как отмечено @Robin, текстовые компоненты также имеют DocumentListener
и DocumentFilter
, который можно добавить для функциональности, более подходящей для текстовых документов. См. Функции текстовых компонентов для получения дополнительной информации о документе listeners и фильтры.
Ответ 2
- KeyBindings (высокая абстракция)
преимущества
-
настраиваемый, доступный,
-
предназначенный для простых ярлыков, без нежелательных побочных эффектов (большинство из этих событий довольно просты и могут быть установлены)
-
неудобно решить любую проблему с фокусом в окне (тоже можно установить, конечно, в Java окно должно сфокусироваться на экране)
-
Качать внутри, чтобы использовать KeyBindings, встроенные ярлыки, действия, больше в Ключевые привязки @camickr (в Swing реализованы интересные ярлыки и действия)
-
вывод должен состоять из действия Swing (такая же высокая абстракция в Swing)
недостатки
-
невозможно переопределить все клавиши с клавиатуры
-
невозможно переопределить три или более клавиши в одно и то же время
-
код выглядит как очень сложный (не совсем верно, код сортирует в большинстве случаев по сравнению с тем же кодом из KeyListener)
-
удален для получения дополнительной информации, чтобы увидеть commnent by @camickr (требуется таймер Swing для повторных действий)
-
невозможно использовать() с помощью одного метода, реализованного в API
.
KeyListeners (слушатель низкого уровня)
преимущества
-
очень проста в использовании, интуитивно понятна
-
код очень короткий для двух ключевых событий
-
не требуется никаких знаний о Swing, Java
-
можно переопределить дерево или нажать несколько клавиш (например,), для очень сложных ключевых команд, тогда не имеет значения, какие из них могут запускать любые отдельные события ключа
-
возможно программировать событие event.consume()
-
возможно прослушивание нефинализированных внутренних событий из составных JComponents (JComboBox, JSpinner...)
недостатки
-
не доступен для части контейнеров и JComponents
-
(J) Компонент должен быть владельцем фокуса и должен быть фокусируемым
-
не предназначенный для Swing JComponents
.
AWTEventListener
-
объединить все события Key и Mouse, прослушиватель низкого уровня, как это возможно в Java
-
в принципе нет смысла использовать этот прослушиватель для большинства (даже очень сложных) графических интерфейсов на основе Swing
-
Я вижу, что этот прослушиватель реализован в пользовательских компонентах на основе AWT. Необходимые одноранговые узлы взяты из родной ОС.
-
но есть превосходные реализации для AWTEventListener Неактивность приложений и слушателей глобальных событий от @camickr
.
уведомление: упорядочение ключевых событий - это разные платформы платформы