Spec-Zone .ru
спецификации, руководства, описания, API
След: Создание GUI С JFC/Swing
Урок: Использование Других Функций Swing
Как Использовать Привязки клавиш
Домашняя страница > Создание GUI С JFC/Swing > Использование Других Функций Swing

Как Использовать Привязки клавиш

JComponent class поддерживает привязки клавиш как способ ответить на отдельные ключи, введенные пользователем. Вот некоторые примеры того, когда привязки клавиш являются соответствующими:

Вы часто не должны использовать привязки клавиш непосредственно. Они используются негласно мнемоникой (поддерживаемый всеми кнопками и снабженными вкладками областями так же как JLabel) и акселераторы (поддерживаемый пунктами меню). Можно найти покрытие мнемоники и акселераторов в разделе, Включающем Работе Клавиатуры.

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

Остальная часть этого раздела дает Вам детали, Вы должны использовать привязки клавиш:

Как Работают Привязки клавиш

Поддержка привязки клавиш, оказанная JComponent полагается InputMap и ActionMap классы, которые были представлены в 1.3. Входная карта связывает нажатия клавиш с именами действия, и карта действия определяет действие, соответствующее каждому имени действия. Технически, Вы не должны использовать имена действия в картах; можно использовать любой объект в качестве "ключа" в карты. Условно, однако, Вы используете строку, которая называет действие.

Каждый 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
Компонент содержит (или), компонент, у которого есть фокус. Эта входная карта обычно используется для составного компонента — компонент, реализация которого зависит от дочерних компонентов. Например, JTables делают все свое использование привязки WHEN_ANCESTOR_OF_FOCUSED_COMPONENT так, чтобы, если пользователь редактирует, клавиша со стрелкой вверх (например) все еще изменила выбранную ячейку.
JComponent.WHEN_IN_FOCUSED_WINDOW
Окно компонента или имеет фокус или содержит компонент, у которого есть фокус. Эта входная карта обычно используется для мнемоники или акселераторов, которые должны быть активными независимо от того, где фокус находится в окне.

Когда пользователь вводит ключ, JComponent код обработки ключевого события перерывает один, или более ввод отображается, чтобы найти допустимую привязку для ключа. Когда это находит привязку, это ищет соответствующее действие в карте действия. Если действие включается, привязка допустима, и действие выполняется. Если это отключается, поиск допустимой привязки продолжается.

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

  1. Фокусируемый компонент WHEN_FOCUSED входная карта.
  2. Фокусируемый компонент WHEN_ANCESTOR_OF_FOCUSED_COMPONENT входная карта.
  3. WHEN_ANCESTOR_OF_FOCUSED_COMPONENT входные карты родителя фокусируемого компонента, и затем родителя его родителя, и так далее, продолжая иерархию включения. Отметьте: Входные карты для отключенных компонентов пропускаются.
  4. 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 для привязок клавиш. Также см., что таблица API Создает и Использует Действие в разделе, Как Использовать Действия.

Получение и Используя InputMaps
Метод Цель
InputMap getInputMap ()
InputMap getInputMap (интервал)
JComponent)
Получите одну из входных карт для компонента. Параметрами может быть один из них JComponent константы: WHEN_FOCUSED, WHEN_IN_FOCUSED_WINDOW, или WHEN_ANCESTOR_OF_FOCUSED_COMPONENT. Метод без параметров добирается WHEN_FOCUSED входная карта.
пусто помещенный (KeyStroke, Объект)
InputMap)
Определите имя действия, связанное с указанным нажатием клавиши. Если второй параметр null, этот метод удаляет привязку для нажатия клавиши. Чтобы заставить нажатие клавиши быть проигнорированным, использовать "none" как второй параметр.
статический KeyStroke getKeyStroke (Строка)
KeyStroke)
Получите объект, определяющий определенное пользовательское действие клавиатуры. Типичными параметрами является "сдвиг alt X", "ВСТАВЬТЕ", и "введенный". См. KeyStroke Документация API для полного изложения и для других форм getKeyStroke метод.
Получение и Используя ActionMaps
Метод Цель
ActionMap getActionMap ()
JComponent)
Получите объект, который отображает имена в действия для компонента.
пусто помещенный (Объект, Действие)
ActionMap)
Установите действие, связанное с указанным именем. Если второй параметр null, этот метод удаляет привязку для имени.

Примеры то Использование Привязки клавиш

Следующая таблица приводит примеры, которые используют привязки клавиш:

Пример Где Описано Примечания
TableFTFEditDemo Как Использовать Таблицы class IntegerEditor регистрирует привязку клавиш на отформатированном текстовом поле, чтобы проверить ввода, когда пользователь нажимает клавишу Enter.
TextComponentDemo Текстовые Компонентные Функции Привязки клавиш регистрируются на текстовой области, чтобы переместиться через текст, когда пользователь нажимает Управление-B, Управление-F, Управление-P, и ключи Control-N.

Проблемы с примерами? Попытайтесь Компилировать и Выполнить Примеры: FAQ.
Жалобы? Поздравление? Предложения? Дайте нам свою обратную связь.

Предыдущая страница: Как Использовать Подсистему Фокуса
Следующая страница: Как Использовать Модальность в Диалоговых окнах