Spec-Zone .ru
спецификации, руководства, описания, API
След: Создание GUI С JFC/Swing
Урок: Пишущие Слушатели События
Раздел: Реализующие Слушатели для Обычно Обрабатываемых Событий
Как Записать Ключевому Слушателю
Домашняя страница > Создание GUI С JFC/Swing > Пишущие Слушатели События

Как Записать Ключевому Слушателю

Ключевые события указывают, когда пользователь вводит в клавиатуре. Определенно, ключевые события запускаются компонентом с клавиатурным фокусом, когда пользователь нажимает или выпускает клавиши на клавиатуре. Для получения дальнейшей информации о фокусе, см., Как Использовать Подсистему Фокуса.


Отметьте: 

Чтобы определить специальные реакции на определенные ключи, используйте привязки клавиш вместо ключевого слушателя. Для дополнительной информации см., Как Использовать Привязки клавиш.


Уведомления отправляются приблизительно два основных вида ключевых событий:

Первый вид события вызывают введенным ключом событием. Второй вид является или нажатым ключом или выпущенным от ключа событием.

Вообще, Вы реагируете на только введенные ключом события, если Вы не должны знать, когда пользователь нажимает клавиши, которые не соответствуют символам. Например, чтобы знать, когда пользователь вводит символ Unicode ⠀”, обрабатывают ли, нажимая одну клавишу такой как или нажимая несколько ключей в последовательности ⠀” Вы введенные ключом события. С другой стороны, чтобы знать, когда пользователь нажимает клавишу F1, или включает ли пользователь, нажатый эти '3', цифровую клавиатуру, Вы обрабатываете нажатые ключом события.


Отметьте: 

Чтобы запустить события клавиатуры, у компонента должен быть клавиатурный фокус.


Чтобы заставить компонент получить клавиатурный фокус, следуйте за этими шагами:

  1. Удостоверьтесь компонент isFocusable возвраты метода true. Это состояние позволяет компоненту получать фокус. Например, можно включить клавиатурному фокусу для a JLabel компонент, вызывая setFocusable(true) метод на метке.
  2. Удостоверьтесь, что компонент запрашивает фокус когда приспособлено. Для пользовательских компонентов реализуйте слушателя мыши, который вызывает requestFocusInWindow метод, когда по компоненту щелкают.

Примечание версии: 

Эта страница отражает API фокуса, представленный в выпуске 1.4 JDK. С того выпуска подсистема фокуса использует ключи обхода фокуса, такие как Вкладка Сдвига и Вкладка. Если Вы должны препятствовать тому, чтобы ключи обхода фокуса были использованы, можно вызвать

component.setFocusTraversalKeysEnabled(false)

на компоненте, который запускает ключевые события. Ваша программа должна тогда обработать обход фокуса самостоятельно. Альтернативно, можно использовать KeyEventDispatcher class, чтобы предварительно слушать все ключевые события. У страницы фокуса есть подробная информация о подсистеме фокуса.


Можно получить подробную информацию об определенном нажатом ключом событии. Например, можно запросить нажатое ключом событие, чтобы определить, было ли оно запущено от ключа действия. Примеры ключей действия включают Копию, Вставку, Страницу, Отмену, и клавиши со стрелками и функциональные клавиши. С выпуска 1.4 JDK можно также запросить нажатое ключом или выпущенное от ключа событие, чтобы определить расположение ключа, который запустил событие. Большинство ключевых событий запускается от стандартной клавиатуры, но событий для некоторых ключей, таких как Сдвиг, имеет информацию о ли пользователь, нажатый клавиша Shift слева или правая сторона клавиатуры. Аналогично, номер '2' может быть введен или от стандартной клавиатуры или от цифровой клавиатуры.

Для введенных ключом событий можно получить ключевое символьное значение так же как любые используемые модификаторы.


Отметьте: 

Недопустимо положиться на ключевое символьное значение, возвращенное из getKeyChar если это не включается во введенное ключом событие.


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

KeyEventDemo.html

Попробуйте это: 
  1. Нажмите кнопку Launch, чтобы работать, KeyEventDemo, используя Сеть Java™ Запускаются (загрузите JDK 6 или позже). Альтернативно, чтобы скомпилировать и выполнить пример самостоятельно, консультируйтесь, пример индексируют.Запускает приложение KeyEventDemo
  2. Введите нижний регистр, нажимая и выпуская ключ на клавиатуре.
    Текстовое поле запускает три события: нажатое ключом событие, введенное ключом событие, и выпущенное от ключа событие. Отметьте, что у введенного ключом события нет информации о коде клавиши, и у нажатых ключом и выпущенных от ключа событий нет ключевой символьной информации. Ни одно из событий до сих пор не от модификатора или ключей действия и ключевого расположения, сообщил относительно нажатых ключом и выпущенных от ключа событий, наиболее вероятный стандарт.
  3. Нажмите кнопку Clear.
    Вы могли бы хотеть сделать это после каждого из следующих шагов.
  4. Нажмите и выпустите клавишу Shift.
    Текстовое поле запускает два события: нажатый ключом и выпущенный от ключа. Текстовое поле не запускает введенное ключом событие, потому что Сдвиг, отдельно, не соответствует никакому символу.
  5. Введите верхний регистр, нажимая клавиши Shift и A.
    Вы будете видеть следующие события, хотя, возможно, не в этом порядке: нажатый ключом (Сдвиг), нажатый ключом (A), ключ, введенный, выпущенный от ключа (A), выпущенный от ключа (Сдвиг). Отметьте, что Сдвиг перечисляется как модифицирующая клавиша для введенных ключом и нажатых ключом событий.
  6. Введите верхний регистр, нажимая и выпуская клавишу Caps Lock, и затем нажимая ключ.
    Следует видеть следующие события: нажатый ключом (Caps Lock), нажатая ключом (A), ключ, введенный, выпущенный от ключа (A). Отметьте, что Caps Lock не перечисляется как модифицирующая клавиша.
  7. Нажмите клавишу Tab. Никакие нажатые клавишей Tab или выпущенные от ключа события не получаются слушателем ключевого события. Это - то, потому что подсистема фокуса использует ключи обхода фокуса, такие как Вкладка Сдвига и Вкладка. Нажмите Вкладку дважды больше, чтобы возвратить фокус текстовой области.
  8. Нажмите функциональную клавишу, такую как F3. Вы будете видеть, что функциональная клавиша является ключом действия.
  9. Нажмите клавишу сдвига влево, сопровождаемую ключом сдвига вправо. Нажатые ключом и выпущенные от ключа события указывают, какая клавиша Shift была введена.
  10. Нажмите клавишу Num Lock, если у Вашей клавиатуры есть цифровая клавиатура.
    Что касается Caps Lock, есть нажатое ключом событие, но никакое выпущенное от ключа событие.
  11. Нажмите эти '2', включают цифровую клавиатуру. Вы видите нажатые ключом, введенные ключом, и выпущенные от ключа события для номера '2'.
  12. Нажмите эти '2', включают стандартную клавиатуру. Снова, Вы видите эти три сообщения о событиях. Введенные ключом события для обоих ключей номер 2 идентичны. Но нажатые ключом и выпущенные от ключа события указывают на различные коды клавиши и различные ключевые расположения.
  13. Нажмите клавишу Num Lock снова. Выпущенное от ключа событие запускается.

Можно найти код примера в KeyEventDemo.java. Вот код обработки ключевого события демонстрационного примера:

public class KeyEventDemo ...  implements KeyListener ... {
    ...//where initialization occurs:
        typingArea = new JTextField(20);
        typingArea.addKeyListener(this);

        //Uncomment this if you wish to turn off focus
        //traversal.  The focus subsystem consumes
        //focus traversal keys, such as Tab and Shift Tab.
        //If you uncomment the following line of code, this
        //disables focus traversal and the Tab events 
        //become available to the key event listener.
        //typingArea.setFocusTraversalKeysEnabled(false);
    ...
    /** Handle the key typed event from the text field. */
    public void keyTyped(KeyEvent e) {
        displayInfo(e, "KEY TYPED: ");
    }

    /** Handle the key-pressed event from the text field. */
    public void keyPressed(KeyEvent e) {
        displayInfo(e, "KEY PRESSED: ");
    }

    /** Handle the key-released event from the text field. */
    public void keyReleased(KeyEvent e) {
        displayInfo(e, "KEY RELEASED: ");
    }
    ...
    private void displayInfo(KeyEvent e, String keyStatus){
        
        //You should only rely on the key char if the event
        //is a key typed event.
        int id = e.getID();
        String keyString;
        if (id == KeyEvent.KEY_TYPED) {
            char c = e.getKeyChar();
            keyString = "key character = '" + c + "'";
        } else {
            int keyCode = e.getKeyCode();
            keyString = "key code = " + keyCode
                    + " ("
                    + KeyEvent.getKeyText(keyCode)
                    + ")";
        }
        
        int modifiersEx = e.getModifiersEx();
        String modString = "extended modifiers = " + modifiersEx;
        String tmpString = KeyEvent.getModifiersExText(modifiersEx);
        if (tmpString.length() > 0) {
            modString += " (" + tmpString + ")";
        } else {
            modString += " (no extended modifiers)";
        }
        
        String actionString = "action key? ";
        if (e.isActionKey()) {
            actionString += "YES";
        } else {
            actionString += "NO";
        }
        
        String locationString = "key location: ";
        int location = e.getKeyLocation();
        if (location == KeyEvent.KEY_LOCATION_STANDARD) {
            locationString += "standard";
        } else if (location == KeyEvent.KEY_LOCATION_LEFT) {
            locationString += "left";
        } else if (location == KeyEvent.KEY_LOCATION_RIGHT) {
            locationString += "right";
        } else if (location == KeyEvent.KEY_LOCATION_NUMPAD) {
            locationString += "numpad";
        } else { // (location == KeyEvent.KEY_LOCATION_UNKNOWN)
            locationString += "unknown";
        }
        
        ...//Display information about the KeyEvent...
    }
}

Ключевой API Слушателя

Интерфейс KeyListener

Соответствующий адаптер class KeyAdapter.

Метод Цель
keyTyped (KeyEvent) Вызванный сразу после того, как пользователь вводит символ Unicode в слушаемый компонент.
keyPressed (KeyEvent) Вызванный сразу после того, как пользователь нажимает клавишу, в то время как у слушаемого компонент есть фокус.
keyReleased (KeyEvent) Вызванный сразу после того, как пользователь отпускает клавишу, в то время как у слушаемого компонент есть фокус.

Класс KeyEvent

KeyEvent class наследовал много полезных методов от InputEvent class, такой как getModifiersEx, и несколько полезных методов от ComponentEvent и AWTEvent классы. См. таблицу Класса InputEvent в странице слушателя мыши для полного списка.

Метод Цель
интервал getKeyChar () Получает символ Unicode, связанный с этим событием. Только положитесь на это значение для введенных ключом событий.
интервал getKeyCode () Получает код клавиши, связанный с этим событием. Код клавиши идентифицирует определенный ключ на клавиатуре что пользователь, нажатый или выпущенный. KeyEvent class определяет много констант кода клавиши для обычно замечаемых ключей. Например, VK_A определяет ключ маркированный A, и VK_ESCAPE определяет Клавишу выхода.
Представьте getKeyText в виде строки (интервал)
Представьте getKeyModifiersText в виде строки (интервал)
Возвратите текстовые описания кода клавиши события и модифицирующих клавиш, соответственно.
интервал getModifiersEx ()
Представьте getModifiersExText в виде строки (международные модификаторы)
Возвратите расширенную маску модификаторов для этого события. Есть методы, наследованные от InputEvent class. Расширенные модификаторы представляют состояние всех модальных ключей. getModifiersExText метод возвращает строку, описывающую расширенные модифицирующие клавиши и кнопки мыши. Начиная с getModifiersEx и getModifiersExText методы предоставляют больше информации о ключевых событиях, они предпочитаются по getKeyText или getKeyModifiersText методы.
булев isActionKey () Возвращает true, если ключ, запускающий событие, является ключом действия. Примеры ключей действия включают Сокращение, Копию, Вставку, Страницу, Caps Lock, клавиши со стрелками и функциональные клавиши. Эта информация допустима только для нажатых ключом и выпущенных от ключа событий.
интервал getKeyLocation () Возвращает расположение ключа, который запустил это событие. Это обеспечивает способ отличить ключи, которые происходят не раз на клавиатуре, такой как эти две клавиши Shift, например. Возможные значения KEY_LOCATION_STANDARD, KEY_LOCATION_LEFT, KEY_LOCATION_RIGHT, KEY_LOCATION_NUMPAD, или KEY_LOCATION_UNKNOWN. Этот метод всегда возвращается KEY_LOCATION_UNKNOWN для введенных ключом событий. Представленный в выпуске 1.4 JDK.

Примеры тот Ключ Использования Слушатели

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

Пример Где Описано Примечания
KeyEventDemo Этот раздел Отчеты все ключевые события, которые происходят на текстовом поле, чтобы демонстрировать обстоятельства, при которых запускаются ключевые события.

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

Предыдущая страница: Как Записать Слушателю Элемента
Следующая страница: Как Записать Слушателю Данных Списка