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

Обработка действий клавиатуры. Событие 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();
// Дальнейшая обработка
Если Вы заметили ошибку, выделите, пожалуйста, необходимый текст и нажмите CTRL + Enter, чтобы сообщить об этом редактору.