Ключевые привязки и ключевые слушатели в 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

.

уведомление: упорядочение ключевых событий - это разные платформы платформы