Обработка действий клавиатуры. Событие TextEvent.
Событие 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 методом getModifiers() и сравнить его результат с константами 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){} }
Событие TextEvent
Событие TextEvent происходит только по одной причине – изменению текста – и отмечается идентификатором TEXT_VALUE_CHANGED.
Соответствующий интерфейс имеет только один метод:
public interface TextListener extends EventListener{ public void textValueChanged(TextEvent e); }
От аргумента е этого метода можно получить ссылку на объект-источник события методом getsource(), унаследованным от класса Eventobject, например, так:
TextComponent tc = (TextComponent)e.getSpurce(); String s = tc.getText(); // Дальнейшая обработка