Иллюстрированный самоучитель по Java

       

Обработка действий клавиатуры


Событие KeyEvent происходит в компоненте по любой из трех причин: 

нажата клавиша — идентификатор KEY_PRESSED; 

отпущена клавиша — идентификатор KEY_RELEASED; 

введен символ — идентификатор KEYJTYPED.

Последнее событие возникает из-за того, что некоторые символы вводятся нажатием нескольких клавиш, например, заглавные буквы вводятся комбинацией клавиш <Shift>+<буква>. Вспомните еще <Аlt>-ввод в MS Windows. Нажатие функциональных клавиш, например <F1>, не вызывает событие KEY_TYPED.

Обрабатываются эти события тремя методами, описанными в интерфейсе:

public interface KeyListener extends EventListener{

public void keyTyped(KeyEvent e);

public void keyPressed(KeyEvent e);

public void keyReleased(KeyEvent e); 

}

Аргумент е этих методов может дать следующие сведения.

Метод e.getKeyChar() возвращает символ Unicode типа char, связанный с клавишей. Если с клавишей не связан никакой символ, то возвращается константа CHAR_UNDEFINED.



Метод

e.

getKeyCode () возвращает код клавиши в виде целого числа типа int. В классе KeyEvent определены коды всех клавиш в виде констант, называемых

виртуальными кодами

клавиш (virtual key codes), например, VK_FI, VK_SHIFT, VK_A, VK_B, VK_PLUS. Они перечислены в документации к классу KeyEvent. Фактическое значение виртуального кода зависит от языка и раскладки клавиатуры. Чтобы узнать, какая клавиша была нажата, надо сравнить результат выполнения метода getKeyCode () с этими константами. Если кода клавиши нет, как происходит при наступлении события KEY_TYPED, то возвращается значение VK_UNDEFINED.

Чтобы узнать, не нажата ли одна или несколько клавиш-модификаторов <Alt>, <Ctrl>, <Meta>, <Shift>, надо воспользоваться унаследованным от класса inputEvent методом getModifierso и сравнить его результат с константами ALT_MASK, CTRL_MASK, META_MASK, SHIFTJMASK. Другой способ — применить логические методы isAltDown(), isControlDown(), isMetaDown(), isShiftDown().

Добавим в листинг 12.3 возможность очистки поля ввода tf после нажатия клавиши <Esc>. Для этого перепишем вложенный класс-слушатель TextMove:

class TextMove implements ActionListener, KeyListener{ 

public void actionPerformed(ActionEvent ae){

ta.append{tf .getText 0+"\n"); 

public void keyPressed(KeyEvent ke) {

if (ke.getKeyCodeO == KeyEvent.VK_ESCAPE) tf.setText(""); 

}

public void keyReleased(KeyEvent ke){)} 

public void keyTyped(KeyEvent ke){} 

}



Содержание раздела