Я отмечаю, что в Java/Swing, по-видимому, существует как минимум два разных способа обработки ключевых событий:
Каковы преимущества/недостатки каждого, и когда вы предпочитаете один, а не другой?
Я отмечаю, что в Java/Swing, по-видимому, существует как минимум два разных способа обработки ключевых событий:
Каковы преимущества/недостатки каждого, и когда вы предпочитаете один, а не другой?
когда вы предпочитаете один, а не другой?
Применить ключевые привязки с момента их введения. A KeyListener
- это соединение нижнего уровня с событиями.
Эта страница привязки клавиш охватывает многие причины, по которым я бы использовал их, а не KeyListener
. В нем перечислены многие вещи, которые просто "недоступны" для KeyListener
. НАПРИМЕР. выбор:
WHEN_FOCUSED
WHEN_ANCESTOR_OF_FOCUSED_COMPONENT
WHEN_IN_FOCUSED_WINDOW
Чем больше я читаю связанный документ, тем меньше я могу понять необходимость задать вопрос. Например:.
Альтернативой привязке клавиш является использование прослушивателей клавиш. Ключевые слушатели имеют свое место в качестве низкоуровневого интерфейса для ввода с клавиатуры, но для ответа на отдельные клавиши привязки клавиш более подходят и, как правило, приводят к более легкому сохранению кода. Ключевым слушателям также сложно, если привязка клавиш должна быть активной, когда компонент не имеет фокуса. Некоторые из преимуществ привязок клавиш - это несколько самостоятельная документация, учет иерархии сдерживания, поощрение многократных фрагментов кода (
Action
объектов) и позволяет легко удалять, настраивать или совместно использовать действия. Кроме того, они упрощают изменение ключа, к которому привязано действие. Другим преимуществомActions
является то, что они имеют разрешенное состояние, которое обеспечивает простой способ отключить действие без необходимости отслеживать, к какому компоненту он подключен.
Как отмечено @Robin, текстовые компоненты также имеют DocumentListener
и DocumentFilter
, который можно добавить для функциональности, более подходящей для текстовых документов. См. Функции текстовых компонентов для получения дополнительной информации о документе listeners и фильтры.
преимущества
настраиваемый, доступный,
предназначенный для простых ярлыков, без нежелательных побочных эффектов (большинство из этих событий довольно просты и могут быть установлены)
неудобно решить любую проблему с фокусом в окне (тоже можно установить, конечно, в 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
.
уведомление: упорядочение ключевых событий - это разные платформы платформы