Spec-Zone .ru
спецификации, руководства, описания, API
|
JComponent
class поддерживает привязки клавиш как способ ответить на отдельные ключи, введенные пользователем. Вот некоторые примеры того, когда привязки клавиш являются соответствующими:
Вы часто не должны использовать привязки клавиш непосредственно. Они используются негласно мнемоникой (поддерживаемый всеми кнопками и снабженными вкладками областями так же как JLabel
) и акселераторы (поддерживаемый пунктами меню). Можно найти покрытие мнемоники и акселераторов в разделе
Альтернатива привязкам клавиш использует Action
объекты), и позволяют действиям быть легко удаленными, настроенным, или совместно использованным. Кроме того, они облегчают изменять ключ, с которым связывается действие. Другое преимущество Действий состоит в том, что у них есть включенное состояние, которое обеспечивает легкий способ отключить действие, не имея необходимость отслеживать, к какому компоненту это присоединено.
Остальная часть этого раздела дает Вам детали, Вы должны использовать привязки клавиш:
Поддержка привязки клавиш, оказанная JComponent
полагается InputMap
и ActionMap
Каждый InputMap
/ActionMap
имеет родителя, который обычно прибывает из UI. Любое время стиль изменяется, родитель, сбрасывается. Таким образом любая привязка, определенная разработчиком, никогда не теряется на изменениях стили.
До 1.3, JComponent
метод registerKeyboardAction
использовался вместо карт ввода и действия. registerKeyboardAction
является теперь устаревшим. (Чтобы гарантировать совместимость для более старых программ, registerKeyboardAction
был повторно реализован, чтобы использовать InputMap
и ActionMap
.)
Каждый JComponent
имеет одну карту действия и три входных карты. Входные карты соответствуют следующим ситуациям с фокусом:
JComponent.WHEN_FOCUSED
WHEN_FOCUSED
входная карта обычно используется, когда у компонента нет никаких дочерних элементов. Например, кнопки связывают клавишу "Пробел", используя WHEN_FOCUSED
карта.JComponent.WHEN_ANCESTOR_OF_FOCUSED_COMPONENT
JTable
s делают все свое использование привязки WHEN_ANCESTOR_OF_FOCUSED_COMPONENT
так, чтобы, если пользователь редактирует, клавиша со стрелкой вверх (например) все еще изменила выбранную ячейку.JComponent.WHEN_IN_FOCUSED_WINDOW
Когда пользователь вводит ключ, JComponent
код обработки ключевого события перерывает один, или более ввод отображается, чтобы найти допустимую привязку для ключа. Когда это находит привязку, это ищет соответствующее действие в карте действия. Если действие включается, привязка допустима, и действие выполняется. Если это отключается, поиск допустимой привязки продолжается.
Если больше чем одна привязка существует для ключа, только первый допустимый найденный используется. Входные карты проверяются в этом порядке:
WHEN_FOCUSED
входная карта.WHEN_ANCESTOR_OF_FOCUSED_COMPONENT
входная карта.WHEN_ANCESTOR_OF_FOCUSED_COMPONENT
входные карты родителя фокусируемого компонента, и затем родителя его родителя, и так далее, продолжая иерархию включения. Отметьте: Входные карты для отключенных компонентов пропускаются.WHEN_IN_FOCUSED_WINDOW
входные карты всех включенных компонентов в фокусируемом окне ищутся. Поскольку порядок поиска компонентов непредсказуем, избегите копии WHEN_IN_FOCUSED_WINDOW
привязка!Давайте рассматривать то, что происходит в двух типичных случаях привязки клавиш: кнопка, реагирующая на клавишу "Пробел", и фрейм с кнопкой значения по умолчанию, реагирующей на клавишу Enter.
В первом случае предположите, что пользователь нажимает клавишу "Пробел" в то время как a JButton
имеет клавиатурный фокус. Во-первых, ключевые слушатели кнопки уведомляются относительно события. Принятие ни одного из ключевых слушателей не использует событие (вызывая consume
KeyEvent
) кнопка WHEN_FOCUSED
с входной картой консультируются. Привязка находится потому что JButton
использование, которое вводит карту, чтобы связать Пространство с именем действия. Имя действия ищется в карте действия кнопки, и actionPerformed
метод действия вызывается. KeyEvent
используется, и обрабатывающие остановки.
Во втором случае предположите, что клавиша Enter нажимается, в то время как фокус где угодно во фрейме, у которого есть кнопка значения по умолчанию (набор, используя JRootPane
setDefaultButton
WHEN_FOCUSED
с входной картой консультируются. Если у этого нет никакой привязки для ключа, или Действие, связанное с ключом, отключается, фокусируемый компонент WHEN_ANCESTOR_OF_FOCUSED_COMPONENT
с входной картой консультируются и затем (если никакая привязка не находится, или Действие, связанное с ключом, отключается), WHEN_ANCESTOR_OF_FOCUSED_COMPONENT
входные карты каждого из предков компонента в иерархии включения. В конечном счете, корневая область WHEN_ANCESTOR_OF_FOCUSED_COMPONENT
входная карта ищется. Так как у той входной карты есть допустимая привязка для, Входят, действие выполняется, заставляя кнопку значения по умолчанию быть щелкнутым.
Вот пример определения, что компонент должен реагировать на ключ F2:
component.getInputMap().put(KeyStroke.getKeyStroke("F2"), "doSomething"); component.getActionMap().put("doSomething", anAction); //where anAction is a javax.swing.Action
Поскольку предыдущий код показывает, чтобы получить действие компонента отображают Вас, используют getActionMap
метод (наследованный от JComponent
). Чтобы получить входную карту, можно использовать getInputMap(int)
метод, где целое число является одним из JComponent.WHEN_*FOCUSED*
константы, показанные в предыдущем списке. Или, в обычном случае, где константа JComponent.WHEN_FOCUSED
, можно только использовать getInputMap
без параметров.
Чтобы добавить запись в одну из карт, используйте put
метод. Вы определяете ключ, используя a KeyStroke
объект, который можно получить использование KeyStroke.getKeyStroke(String)
Action
(чтобы вставить карту действия) в том
Вот немного более сложный пример, который определяет, что компонент должен реагировать на клавишу "Пробел" как будто пользователь, которым щелкают мышь.
component.getInputMap().put(KeyStroke.getKeyStroke("SPACE"), "pressed"); component.getInputMap().put(KeyStroke.getKeyStroke("released SPACE"), "released"); component.getActionMap().put("pressed", pressedAction); component.getActionMap().put("released", releasedAction); //where pressedAction and releasedAction are javax.swing.Action objects
Чтобы заставить компонент проигнорировать ключ, на который это обычно отвечает, можно использовать специальное действие не, называют "ни один". Например, следующий код заставляет компонент проигнорировать ключ F2.
component.getInputMap().put(KeyStroke.getKeyStroke("F2"), "none");
Предыдущий код не предотвращает соответствующее WHEN_ANCESTOR_OF_FOCUSED_COMPONENT
и WHEN_IN_FOCUSED_WINDOW
ввод отображается от того, чтобы быть искавшимся привязки клавиш F2. Чтобы предотвратить этот поиск, следует использовать допустимое действие вместо "ни одного". Например:
Action doNothing = new AbstractAction() { public void actionPerformed(ActionEvent e) { //do nothing } }; component.getInputMap().put(KeyStroke.getKeyStroke("F2"), "doNothing"); component.getActionMap().put("doNothing", doNothing);
Следующие таблицы приводят обычно используемый API для привязок клавиш. Также см., что таблица API
Метод | Цель |
---|---|
InputMap getInputMap () (в JComponent ) |
Получите одну из входных карт для компонента. Параметрами может быть один из них JComponent константы: WHEN_FOCUSED , WHEN_IN_FOCUSED_WINDOW , или WHEN_ANCESTOR_OF_FOCUSED_COMPONENT . Метод без параметров добирается WHEN_FOCUSED входная карта. |
(в InputMap ) |
Определите имя действия, связанное с указанным нажатием клавиши. Если второй параметр null , этот метод удаляет привязку для нажатия клавиши. Чтобы заставить нажатие клавиши быть проигнорированным, использовать "none" как второй параметр. |
(в KeyStroke ) |
Получите объект, определяющий определенное пользовательское действие клавиатуры. Типичными параметрами является "сдвиг alt X", "ВСТАВЬТЕ", и "введенный". См. KeyStroke Документация APIgetKeyStroke метод. |
Метод | Цель |
---|---|
(в JComponent ) |
Получите объект, который отображает имена в действия для компонента. |
(в ActionMap ) |
Установите действие, связанное с указанным именем. Если второй параметр null , этот метод удаляет привязку для имени. |
Следующая таблица приводит примеры, которые используют привязки клавиш:
Пример | Где Описано | Примечания |
---|---|---|
TableFTFEditDemo |
|
class |
TextComponentDemo | Текстовые Компонентные Функции | Привязки клавиш регистрируются на текстовой области, чтобы переместиться через текст, когда пользователь нажимает Управление-B, Управление-F, Управление-P, и ключи Control-N. |