Привязки ключей и прослушиватели ключей в Java

Я отмечаю, что в Java / Swing существует, по крайней мере, два разных способа обработки ключевых событий:

каковы преимущества / недостатки каждого из них, и когда вы должны предпочесть один, а не другой?

2 ответов


когда вы должны предпочесть один, а не другой?

предпочитаете комбинации клавиш, так как они были введены. А KeyListener - Это соединение более низкого уровня с событиями.

эта страница для комбинации клавиш охватывает множество причин, по которым я хотел бы использовать их, а не KeyListener. В нем перечислены многие вещи, которые просто "недоступны" для KeyListener. Выбор Е. Г. из:

  • WHEN_FOCUSED
  • WHEN_ANCESTOR_OF_FOCUSED_COMPONENT
  • WHEN_IN_FOCUSED_WINDOW

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

альтернативы клавиш с помощью ключа слушателей. Ключевые слушатели имеют свое место в качестве низкоуровневого интерфейса для ввода с клавиатуры, но для ответа на отдельные клавиши привязки клавиш более уместны и, как правило, приводят к более легко поддерживаемый код. Прослушиватели ключей также сложны, если привязка ключа должна быть активной, когда компонент не имеет фокуса. Некоторые из преимуществ Привязок ключей-они несколько самодокументированы, учитывают иерархию сдерживания, поощряют многоразовые куски кода (Action объекты) и позволяют легко удалять, настраивать или совместно использовать действия. Кроме того, они позволяют легко изменить ключ, к которому привязано действие. Еще одно преимущество Actions это то, что у них есть включено состояние, которое обеспечивает простой способ отключить действие без необходимости отслеживать, к какому компоненту оно прикреплено.

текстовые компоненты

как отметил @Robin, текстовые компоненты также имеют DocumentListener & DocumentFilter который может быть добавлен для функциональности, более подходящей для текстовых документов. См. Функции Текстовых Компонентов для получения дополнительной информации о документе слушатель & фильтры.


  1. привязки клавиш (высокая абстракция)

преимущества

  • настраиваемые, разделяемых,

  • предназначен для простых ярлыков, без побочных эффектов 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

.

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