Обработка действий клавиатуры
Событие KeyEvent происходит в компоненте по любой из трех причин:
□ нажата клавиша — идентификатор key_pressed;
□ отпущена клавиша — идентификатор key_released;
□ введен символ — идентификатор key_typed.
Последнее событие возникает из-за того, что некоторые символы вводятся нажатием нескольких клавиш, например заглавные буквы вводятся комбинацией клавиш ^Ый>+<буква>. Вспомните еще <АИ>-ввод в MS Windows. Нажатие функциональных клавиш, например
Обрабатываются эти события тремя методами, описанными в интерфейсе:
public interface KeyListener extends EventListener{ public void keyTyped(KeyEvent e);
public void keyPressed(KeyEvent e); public void keyReleased(KeyEvent e);
}
Аргумент e этих методов может дать следующие сведения.
Метод e.getKeyChar() возвращает символ Unicode типа char, связанный с клавишей. Если с клавишей не связан никакой символ, то возвращается константа char_undefined.
Метод e.getKeyCode () возвращает код клавиши в виде целого числа типа int. В классе KeyEvent определены коды всех клавиш в виде констант, называемых
Чтобы узнать, не нажата ли одна или несколько клавиш-модификаторов
SHIFT_MASK. Другой способ применить логические методы isAltDown(), isControlDown ( ),
isMetaDown(), isShiftDown().
Добавим в листинг 15.3 возможность очистки поля ввода tf после нажатия клавиши
class TextMove implements ActionListener, KeyListener{ public void actionPerformed(ActionEvent ae){ ta.append(tf.getText()+"\n");
}
public void keyPressed(KeyEvent ke){
if (ke.getKeyCode() == KeyEvent.VK ESCAPE) tf.setText("");
}
public void keyReleased(KeyEvent ke){} public void keyTyped(KeyEvent ke){}
}
3. Реализуйте обработку нажатия различных клавиш.
Событие
Событие TextEvent происходит только по одной причине — изменению текста — и отмечается идентификатором text_value_changed.
Соответствующий интерфейс имеет только один метод:
public interface TextListener extends EventListener{ public void textValueChanged(TextEvent e);
От аргумента e этого метода можно получить ссылку на объект-источник события методом getSource (), унаследованным от класса EventObj ect, например, так:
JTextComponent tc = (JTextComponent)e.getSource();
String s = tc.getText();
// Дальнейшая обработка
Событие изменения
Еще одно событие общего характера ChangeEvent происходит при изменении состояния компонента Swing: щелчке кнопкой мыши на кнопке Swing любого типа, выборе пункта меню, движении ползунка и "градусника", смене страниц на панели с вкладками. Большинство этих компонентов реагируют на собственные события, более удобные для обработки, но для окна выбора цвета JColorChooser и ползунка JSlider это основное событие.
Поскольку событие класса aangeEvent носит такой общий характер, в этом классе нет собственных методов, только унаследованный метод getSource ( ).
Слушатель этого события changeListener обладает всего одним методом:
public void stateChanged(ChangeEvent);
При обработке события следует получить ссылку на источник и извлечь из него всю необходимую информацию, например:
import javax.swing.event.*;
class SliderHandler implements ChangeListener{
private int threshold; private JLabel l;
public SliderHandler(int threshold, JLabel l){ this.threshold = threshold; this.l = l;
}
public void stateChanged(ChangeEvent e){
JSlider sl = (JSlider)e.getSource(); if (!sl.getValueIsAdjusting())
if (threshold <= (int)sl.getValue()) l.setText("Порог достигнут");
}
}
Обработка действий с окном
Событие WindowEvent может произойти по двенадцати причинам:
□ окно открылось — идентификатор window_opened;
□ окно закрылось — идентификатор window_closed;
□ попытка закрытия окна — идентификатор window_closing;
□ окно получило фокус — идентификатор window_activated;
□ процесс получения фокуса — идентификатор window_gained_focus;
□ окно потеряло фокус — идентификатор window_deactivated;
□ процесс потери фокуса — идентификатор window_lost_focus;
□ окно свернулось в ярлык — идентификатор window_iconified;