Главная страница

Java. Полное руководство. 8-е издание. С. Н. Тригуб Перевод с английского и редакция


Скачать 25.04 Mb.
НазваниеС. Н. Тригуб Перевод с английского и редакция
АнкорJava. Полное руководство. 8-е издание.pdf
Дата28.02.2017
Размер25.04 Mb.
Формат файлаpdf
Имя файлаJava. Полное руководство. 8-е издание.pdf
ТипДокументы
#3236
страница66 из 90
1   ...   62   63   64   65   66   67   68   69   ...   90

FOCUS_GAINED, то параметр
другое
будет ссылаться на компонент, теряющий фокус. В противоположность этому, если происходит событие
FOCUS_LOST, то параметр
другое
ссылается на компонент, получающий фокус.
Вы можете определить другие компоненты вызовом метода
getOppositeCom-
ponent ()
, показанного ниже Метод возвращает противоположный компонент.
Метод
isTemporary
() указывает на то, является ли изменение фокуса временным. Его форма такова Метод возвращает значение
true, если изменение временно. В противном случае он возвращает значение
false.

7 2 4 Часть II. Библиотека Класс
i n p u t E v e n Абстрактный класс
InputEvent является подклассом класса
Component
Event и суперклассом для событий ввода компонента. Его подклассы —
KeyEvent и Класс
InputEvent определяет несколько строковых констант, представляющих любые модификаторы, такие как признак нажатия управляющих клавиш, которые могут быть ассоциированы с событием. Изначально класс
InputEvent определяет следующие восемь значений для представления модификаторов LT_MASK

BUTT0N2_MASK
META_MASK
ALT_GRAPH_MASK
BUTT0N3_MASK
SHIFTJYLASK
BUTT0N1_MASK
C Однако поскольку существует возможность конфликтов в используемых модификаторах между клавиатурными событиями, событиями мыши, а также другие проблемы, были добавлены следующие расширенные значения модификаторов
2
_D0WN_MAS
К
META_D0WN_MASK
ALT_GRAPH_DOWN_MASK
BUTTON3_D0WN_MASК
SHIFT_D0WN_MASK
BUTTON1_D0WN_MASК
CTRL_D0WN_MASK
П ри написании нового кода рекомендуется использовать новые расширенные модификаторы вместо исходных.
Чтобы проверить, какая клавиша модификатора была нажата в момент события, используйте методы
i s A l t D o w n (), i s A l t G r a p h D o w n (), i s C o n t r o l D o w n (),
i s M e t a D o w n () и
is
Shi ft
D o w n ()
. Формы этих методов показаны ниже isAltDown()

boolean isAltGraphDown()
boolean isControlDown()
boolean isMetaDown()
boolean Вы можете получить значение, содержащее все флаги исходных модификаторов, вызовом метода
getModif
iers ()
. Он выглядит так Расширенные модификаторы можно получить методом
getModif
iersEx (), показанным ниже Класс

i t e m E v e n Объект класса
ItemEvent создается при щелчке на флажке или элементе списка либо при выборе отмечаемого пункта меню. (Флажки и окна списков будут описаны далее) Существует два типа событий элементов, которые идентифицируются целочисленными константами, описанными в табл. Таблица 23.4. Константы, определенные классом Ite m E v e n t
Константа
Описание
DESELECTED
SELECTED
Пользователь отменил выбор элемента Пользователь выбрал элемент
Глава 23. Обработка событий 2 Кроме того, класс
ItemEvent определяет одну целочисленную константу
ITEM_STATE_CHANGED, которая сигнализирует об изменении состояния.
Класс
ItemEvent имеет следующий конструктор источник int тип Object элемент int
состояние)
Здесь источник ссылка на компонент, известивший о событии. Например, это может быть список или элемент выбора. Тип события указывается параметром тип Конкретный элемент, приведший к событию, передается в параметре элемент Текущее состояние элемента содержится в параметре сост ояние.

Метод
get
Item
() может быть использован для получения ссылки на элемент, приведший к событию. Его сигнатура выглядит так Метод
get
ItemSelectable
() может быть использован для получения ссылки на объект
ItemSelectable, известивший о событии. Его общая форма показана ниже Списки и флажки являются примерами элементов пользовательского интерфейса, реализующих интерфейс Метод
getStateChanged
() возвращает измененное состояние (те. значение
SELECTED или
DESELECTED) для события. Выглядит он так Класс
K e y E v e n Объект класса
KeyEvent создается при клавиатурном вводе. Существует три типа клавиатурных событий, идентифицируемых целочисленными константами, —
KEY_PRESSED, KEY_RELEASED и
KEY_TYPED. События первых двух типов происходят при нажатии и отпускании клавиши. Последний же тип происходит при вводе символа. Помните, что нажатие не всех клавиш приводит к вводу символа. Например, нажатие клавиши не вводит никакого символа.
Класс
KeyEvent определяет множество других целочисленных констант. Например, константы
VK_0-VK_9 и
VK_A-VK_Z определяют эквиваленты ASCII чисел и букв. А вот еще несколько других констант Константы
VK задают коды виртуальных клавиш, независящие от любых модификаторов вроде , или Класс
KeyEvent является подклассом класса
Input
Event. Вот один из его конструкторов (Component источник тип когда модификаторы код char
символ)
Здесь источник ссылка на компонент, извещающий о событии. Тип события указывается параметром тип Системное время, когда была нажата клавиша, передается в параметре когда Аргумент модификаторы указывает, какие модификаторы были нажаты в момент события клавиши. Код виртуальной клавиши, такой как
VK_UP, VK_A итак далее, передается в параметре код Символьный эквивалент если есть) передается в параметре символ Если никакого корректного символа событие не содержит, то символ содержит значение
CHAR_UNDEFINED. Для событий
KEY_TYPED параметр код будет содержать значение
VK_UNDEFINED.

7 2 Часть II. Библиотека Класс
KeyEvent определяет несколько методов, но, вероятно, наиболее часто используемые из них — это метод
get
Key
Char ()
, возвращающий символ клавиши, и метод
get
Key
Code ()
, возвращающий код клавиши. Их общая форма представлена ниже getKeyChar()

int Если никаких корректных символов нажатие клавиши не создает, то метод
() возвращает значение
CHAR_UNDEFINED. При событии
KEY_TYPED метод
getKeyCode
() возвращает значение Класс

M o u s e E v e n Существует восемь типов событий мыши. Класс
MouseEvent определяет для их идентификации набор целочисленных констант, которые описаны в табл. Таблица 23.5. Константы, определенные классом
M o u s e E v e n Константа . ’ * ’ Описание
^
:

Пользователь щелкнул кнопкой мыши
M0USE_DRAGGED
Пользователь перетащил мышь при нажатой кнопке
M0USE_ENTERED
Курсор мыши вошел в компонент
M0USE_EXITED
Курсор мыши покинул компонент

S
E_M0VE Мышь перемещена
M0USE_PRESSED
Кнопка мыши нажата
MOUSE_RELEASED
Кнопка мыши отпущена

S
E_WH Выполнена прокрутка колесика мыши
Класс
MouseEvent
— это подкласс класса
InputEvent. Вот один из его конструкторов источнику int тип когда int модификаторы х ,
int у ,
int щелчки boolean
вызовМеню)
Здесь источник

ссылка на компонент, извещающий о событии. Тип события указан параметром
тип.
Системное время, когда произошло событие, передается в параметре
когда.
Аргумент
модификаторы
указывает, какие клавиши модификаторов были нажаты в момент события мыши. Координаты курсора мыши передаются параметрами хи у. Счетчик щелчков передается в параметре щелчки Флаг
вызовМеню
указывает, должно ли данное событие вызывать всплывающее меню на данной платформе.
Два часто используемых метода этого класса — это методы
g e t X (
) и
g e t Y (Они возвращают координаты X и Y курсора мыши на момент события. Их форма такова g e t X O
int g e t Y (В качестве альтернативы для получения координат курсора мыши вы можете использовать метод
g e t P o i n t ()
. Он показан ниже Этот метод возвращает объект класса
Point, содержащий координаты X, Y в своих целочисленных членах хи у
Глава 23. Обработка событий 2 Метод
translatePoint () изменяет местоположение события. Его форма показана ниже translatePoint(int х, int у)
Здесь аргументы хи у добавляются к первоначальным координатам события.
Метод g e t C l i c k C o u n t () получает количество щелчков мыши для данного события. Его сигнатура показана ниже Метод i s P o p u p T r i g g e r () проверяет, вызывает ли данное событие всплывающее меню на текущей платформе. Его форма такова Также доступен метод g e t B u t t o n (), показанный ниже Он возвращает значение, представляющее кнопку, вызвавшую событие. Возвращаемое значение будет одной из констант, определенных в классе M Значение
NOBUTTON указывает на то, что никакая кнопка не была нажата или отпущена. Доступны также три метода класса
MouseEvent, которые получают координаты мыши относительно экрана, а не компонента. Они показаны ниже getLocationOnScreen()
int getXOnScreen()
int Метод
getLocationOnScreen
() возвращает объект класса
Point, содержащий обе координаты — X и Y. Другие два метода возвращают по одной координате соответственно.
Класс Мои Этот класс инкапсулирует событие колесика мыши. Он является подклассом класса
MouseEvent. Не все мыши оснащены колесиками. Если у мыши есть колесико, оно располагается между левой и правой кнопками. Эти колесики используются для прокрутки (изображения, текста, таблиц и т.п.). Класс
MouseWheelEvent определяет две целочисленные константы, описанные в табл. Таблица 23.6. Константы, определенные классом o u s e W h e e l E v e n t

Константа
Описание
WHEEL_BL0CKJSCR0LL
Произошло событие прокрутки на страницу вверх или вниз
WHEEL_UNIT_SCROLL
Произошло событие прокрутки на строку вверх или вниз
Вот один из конструкторов, определенных в классе
MouseWheelEvent.
MouseWheelEvent(Component источник int тип long когда модификаторы int х, int у ,
int щелчки,
boolean
вызовМеню,
int
какПрокрутить,
int сколько int
количество)
Здесь источник ссылка на компонент, извещающий о событии. Тип события указан параметром тип Системное время события передается в параметре когда Аргумент модификаторы указывает, какие клавиши модификаторов были нажаты в момент события мыши. Координаты курсора мыши передаются параметрами хну Часть II. Библиотека Счетчик щелчков передается в параметре
щелчки.
Флаг
вызовМеню
указывает на то, должно ли данное событие вызывать всплывающее меню на текущей платформе. Значением параметра
какПрокрутить
должно быть либо
WHEEL_UNIT_SCROLL, либо
WHEEL_BLOCK_SCROLL. Количество единиц прокрутки передается в параметре
сколько.
Параметр
количество
указывает количество единиц прокрутки, на которое повернуто колесико.
Класс
MouseWhe
el
Event определяет методы, предоставляющие доступ к событию колесика. Чтобы получить количество единиц прокрутки, вызовите метод
getWheelRotat
ion ()
, показанный ниже Он возвращает количество единиц прокрутки. Если значение положительно, значит, колесико повернуто против часовой стрелки, если же отрицательно — то почасовой стрелке. В комплекте JDK 7 представлен метод
getPreciseWheel
RotationO, поддерживающий колесико с высокой разрешающей способностью. Он работает, как и метод
getWheelRotation ()
, но возвращает значение типа Чтобы получить тип прокрутки, вызовите метод
getScrollType ().
int Он возвращает либо значение
WHEEL_UNIT_SCROLL, либо значение
WHEEL_
BLOCK_SCROLL. Если типом прокрутки является
WHEEL_UNIT_SCROLL, то вы получите количество единиц прокрутки непосредственно методом
get
Scroll
Amount ()
. Этот метод выглядит следующим образом Класс

T e x t E v e n Экземпляры этого класса описывают текстовые события. Они создаются текстовыми полями и областями, когда в них осуществляется ввод пользователем или программой. Класс
TextEvent определяет целочисленную константу
ТЕХТ_ Единственный конструктор этого класса показан ниже источник int

тип)
Здесь источник
ссылка на объект, извещающий о событии. Тип события указывается параметром
тип.
Объект класса
TextEvent не включает символов, находящихся в данный момент в текстовом компоненте, известившем о событии. Вместо этого ваша программа должна использовать другие методы, ассоциированные с текстовым компонентом, для извлечения информации. Эта операция отличается от других объектов событий, о которых речь пойдет в следующем разделе. По этой причине никакие методы класса
TextEvent мы пока не обсуждаем. Уведомления о текстовом событии следует считать сигналом слушателю о том, что последний должен извлечь информацию из указанного текстового компонента.
Класс
w i n d o w E v e n Существует десять типов событий окон. Класс
WindowEvent определяет целочисленные константы, которые могут использоваться для их идентификации. Эти константы вместе сих описаниями перечислены в табл. 23.7.
Глава 23. Обработка событий
7 2 Таблица 23.7. Константы, определенные классом
w i n d o w E v e n Ш г ша было активизировано
WIND0W_CL0SED
Окно было закрыто
WIND0W_CL0SING
Пользователь запросил закрытие окна
WINDOW_DEACTIVATED
Окно деактивизировано
WIND0W_DEIC0NIFIED
Окно развернуто
WIND0W_GAINED_F0CUS
Окно получило фокус ввода
WIND0W_IC0NIFIED
Окно свернуто
WIND0W_L0ST_F0CUS
Окно утратило фокус ввода
WIND0W_0PENED
Окно было открыто
WINDOW_STATE_CHANGED
Состояние окна изменилось
Класс
WindowEvent
— это подкласс класса
ComponentEvent. Он определяет несколько конструкторов. Рассмотрим первый источник
тип)
Здесь источник
ссылка на объект, известивший о событии. Тип события передается в параметре тип Следующие три конструктора обеспечивают более подробный контроль источник int тип Window другое источник тип int

изСостояни я int

вСостояние)
WindowEvent(Window источник тип Window другое
изСостояния,
int
вСостояние)
Здесь параметр другое определяет противоположное окно при событии фокуса или активизации. Параметр
изСостояния определяет предыдущее состояние окна, а параметр
вСостояние
— новое состояние, которое окно получает при смене состояния.
Часто используемый метод этого класса —
get
Window ()
. Он возвращает объект класса
Window, известивший о событии. Вот его общая форма Класс
WindowEvent также определяет методы, возвращающие противоположное окно (при событиях фокуса или активизации, предыдущее состояние окна, а также его текущее состояние. Эти методы показаны ниже getOppositeWindow()
int getOldState()
int Источники событий
В табл. 23.8 перечислены некоторые компоненты пользовательского интерфейса, способные извещать о событиях, описанных в предыдущем разделе. В дополнение к элементам графического пользовательского интерфейса, любой класс, унаследованный от класса
Component, такой как класс
Applet, способен извещать о событиях. Например, вы можете получать события клавиатуры и мыши от аплета. (Также вы можете создавать собственные компоненты, которые извещают о событиях) В этой главе поговорим только о событиях клавиатуры и мыши, а в следующих главах речь пойдет об обработке событий от источников, перечисленных в табл. 23.8.
Таблица 23.8. Примеры источников событий 3 0 Часть II. Библиотека Источник событий
Описание
Кнопка
Флажок
Переключатель
Список
Пункт меню
Полоса прокрутки Текстовые компоненты
Окно
Извещает о событии действия при нажатии кнопки
Извещает о событиях элемента при установке и сбросе флажка
Извещает о событиях элемента при изменении выбора
Извещает о событиях действия при двойном щелчке на элементе извещает о событии элемента при выделении или снятии выделения с элемента
Извещает о событиях действия при выборе пункта меню извещает о событии элемента при установке и сбросе флажка с пункта меню
Извещает о событиях настройки при манипуляциях с полосой прокрутки
Извещает о текстовых событиях, когда пользователь вводит символ
Извещает о событиях окна при активизации, закрытии, деак­
тивизации, развертывании, свертывании, открытии окна или выходе из окна
Интерфейсы слушателей событий
Как уже объяснялось, модель делегирования событий состоит из двух частей источников и слушателей. Слушатели создаются при реализации одного или нескольких интерфейсов, определенных в пакете
j ava .
a w t .
event. Когда происходит событие, его источник вызывает соответствующий метод, определенный в слушателе, и передает объект события в качестве аргумента. В табл. 23.9 перечислены часто используемые интерфейсы слушателей и представлено краткое описание методов, определяемых ими. В следующих разделах рассматриваются специфические методы, содержащиеся в каждом интерфейсе.
Таблица 23.9. Часто используемые интерфейсы слушателей событий
Интерфейс
------ -
—•&
.

................. —
..—

. -
Описание
ActionListener
Определяет один метод для принятия событий действия

us
tmentList Определяет один метод для принятия событий настройки
ComponentListener
Определяет четыре метода для распознавания сокрытия, перемещения, изменения размера или отображения компонента
ContainerListener
Определяет два метода для распознавания того, когда компонент добавляется в контейнер либо исключается из него
FocusListener
Определяет два метода для распознавания получения или утраты компонентом фокуса клавиатурного ввода
ItemListener
Определяет один метод, указывающий момент изменения состояния элемента
KeyListener
Определяет три метода, распознающих нажатие, отпускание клавиши либо ввод символа
Глава 23. Обработка событий 3 Окончание табл. 23.9
Описание
MouseListener
Определяет пять методов, распознающих щелчок мыши, момент входа курсора мыши на поле компонента, его выхода за пределы компонента, нажатия и отпускания кнопок мыши

s
eMo Определяет два метода для распознавания перетаскивания или движения мыши
MouseWheelListener
Определяет один метод, распознающий движение колесика мыши
TextListener
Определяет один метод, распознающий изменение текстового значения
WindowFocusListener
Определяет два метода для распознавания получения или утраты окном фокуса ввода
WindowListener
Определяет семь методов, распознающих активизацию окна, закрытие, деактивизацию, развертывание, свертывание, открытие или выход
Интерфейс
A c t i o n L i s t e n e Этот интерфейс определяет метод
a c t i o n P e r f o r m e d ()
, вызываемый при событии действия. Его общая форма показана ниже actionPerformed(ActionEvent Интерфейс

A d j u s t m e n t L i s t e n e Этот интерфейс определяет метод
a d j u s t m e n t V a l u e C h a n g e d ()
, вызываемый при событии настройки. Его общая форма такова adjustmentValueChanged(AdjustmentEvent Интерфейс

C o m p o n e n t L i s t e n e Этот интерфейс определяет четыре метода, вызываемых при изменении размера компонента, его перемещении, отображении или сокрытии. Их общая форма представлена ниже componentResized(ComponentEvent
ce)
void componentMoved(ComponentEvent
ce)
void componentShown(ComponentEvent ce)
void componentHidden(ComponentEvent Интерфейс
C o n t a i n e r L i s t e n e Этот интерфейс содержит два метода. Когда компонент добавляется к контейнеру, вызывается метод
c o m p o n e n t
A d d e d ()
. Когда же компонент удаляется из контейнера, вызывается метод
c o m p o n e n t R e m o v e d ()
. Их общие формы выглядят следующим образом componentAdded(ContainerEvent

ce)
void componentRemoved(ContainerEvent
ce)

7 3 Часть II. Библиотека Интерфейс
F o c u s L i s t e n e Этот интерфейс определяет два метода. Когда компонент получает фокус клавиатурного ввода, вызывается метод f o c u s G a i n e d (). Когда компонент теряет фокус ввода, вызывается метод f o c u s L o s t (). Обобщенная форма этих методов показана ниже focusGained(FocusEvent
fe)
void focusLost(FocusEvent Интерфейс
i t e m L i s t e n e Этот интерфейс определяет метод
itemStateChanged ()
, вызываемый при изменении состояния элемента. Его общая форма такова itemStateChanged(ItemEvent Интерфейс

K e y L i s t e n e Этот интерфейс определяет три метода. Методы
keyPressed() и
keyRe-
leased() вызываются, соответственно, при нажатии и отпускании клавиш. Метод
keyTyped
() вызывается при вводе символа.
Например, если пользователь нажимает и отпускает клавишу А, последовательно происходит три события нажатие клавиши, ввод символа, отпускание клавиши. Если пользователь нажимает и отпускает клавишу Ноше, происходит последовательно только два события нажатие клавиши и ее отпускание.
Общие формы этих методов выглядят следующим образом.
^
void keyPressed(KeyEvent
ke)
void keyReleased(KeyEvent
ke)
void keyTyped(KeyEvent Интерфейс
M o u s e L i s t e n e Этот интерфейс определяет пять методов. Если кнопка мыши нажата и отпущена водной и той же точке, вызывается метод m o u s e C l i c k e d (). Когда курсор мыши входит на поле компонента, вызывается метод m o u se E n te re d (). Когда же он покидает поле компонента, вызывается метод m o u s e E x i t e d (). Методы m ouse-
P r e s s e d () и m o u se R e le a s e d () вызываются, соответственно, когда кнопка мыши нажимается и отпускается. Общие формы этих методов представлены нижете Интерфейс

M o u s e M o t i o n L i s t e n e Этот интерфейс определяет два метода. Метод
mouseDragged
() вызывается множество раз при перетаскивании объекта мышью. Метод
mouseMoved
() вызывается множество раз при перемещении мыши. Их общая форма такова mouseDragged(MouseEvent те)
void mouseMoved(MouseEvent
me)
Глава 23. Обработка событий 3 Интерфейс
M o u s e W h e e l L i s t e n e Этот интерфейс определяет метод
mouseWheelMoved ()
, вызываемый при прокрутке колесика мыши. Его общая форма показана ниже mouseWheelMoved(MouseWheelEvent Интерфейс

T e x t L i s t e n e Этот интерфейс определяет метод
text
Changed ()
, вызываемый при изменении содержимого текстовой области или текстового поля. Его общая форма выглядит следующим образом textChanged(TextEvent Интерфейс

W i n d o w F o c u s L i s t e n e Этот интерфейс определяет два метода —
windowGainedFocus
() и
window-
Lo
st
Focus ()
. Они вызываются, когда окно получает и утрачивает фокус ввода. Их общая форма показана ниже windowGainedFocus(WindowEvent

we)
void windowLostFocus(WindowEvent Интерфейс
W i n d o w L i s t e n e Этот интерфейс определяет семь методов. Методы
windowActivated
() и
windowDeactivated
() вызываются, когда окно, соответственно, активизируется и деактивизируется.
Если окно сворачивается в пиктограмму, вызывается метод
windowlconi-
f
ied ()
. Когда окно разворачивается, вызывается метод
windowDelconif
ied (Когда окно открывается и закрывается, вызываются методы
windowOpened
() и
windowClosed
(). Метод
windowClosing
() вызывается при закрытии окна. Общие формы этих методов выглядят следующим образом windowActivated(WindowEvent we)

void windowClosed(WindowEvent
we)
void windowClosing(WindowEvent
we)
void windowDeactivated(WindowEvent
we)
void windowDeiconified(WindowEvent we)
void windowlconified(WindowEvent
we)
void windowOpened(WindowEvent Использование модели делегирования событий
Теперь, когда вы ознакомились с теорией, лежащей в основе модели делегирования событий, и получили представление о различных ее компонентах, наступило время обратиться к практике. Использовать модель делегирования событий довольно легко. Нужно просто выполнить следующие два действия. Реализовать соответствующий интерфейс в слушателе, чтобы он мог принимать события нужного типа. Реализовать код регистрации и отмены регистрации (при необходимости) слушателя как получателя уведомлений о событии

7 3 Часть II. Библиотека Следует помнить, что источник может извещать о нескольких типах событий. Каждое событие должно быть зарегистрировано отдельно. К тому же объект может подписаться на получение нескольких типов событий и должен реализовать все интерфейсы, необходимые для получения этих собы тий.
Ч тобы увидеть, как модель делегирования событий работает на практике, мы разберем примеры, обрабатывающие два часто используемых генератора событий событий мыши и клавиатуры.
Обработка событий мыши
Ч тобы обработать события мыши, следует реализовать интерфейсы и M o u s e M o t i o n L i s te n e r . (Вы можете также реализовать интерфейс, номы не станем делать этого здесь) Следующий аплет демонстрирует весь процесс. Оно тоб раж ает текущие координаты мыши в строке состояния. Всякий раз, когда нажимается кнопка, отображается слово " Down" в точке, где находится курсор мыши. При каждом отпускании кнопки отображается слово " U p". При щелчке на кнопке, в левом верхнем углу отображаемой области аплета выводится сообщение" При входе и выходе курсора мыши из поля окна аплета в левом верхнем углу отображаемой области ап лета также выводится соответствующее сообщение. При перетаскивании мышью отображается символ " * ", сопровождающий курсор мыши. Обратите внимание две переменные и m ouseY — сохраняют местоположение курсора мыши, когда происходят события нажатия и отпускания кнопки, а также события перетаскивания. Эти координаты затем используются методом p a i n t () для отображения вывода в точке возникновения события Использование обработчиков событий мыши
import java.awt.*;
import j a v a .a w t .event.*;
import java.applet.*;
/*


*/
public class MouseEvents extends Applet
implements MouseListener, MouseMotionListener {
String msg = "";
int mouseX = 0, mouseY = 0 ; // координаты курсора мыши void ini t () {
addMouseListener(this);
addMouseMotionListener(this);
}
// Обработка щелчка мыши void mouseClicked(MouseEvent me) {
// сохранить координаты = 0;
mouseY = 10;
msg = "Mouse clicked.";
// msg = "Щелчок кнопкой мыши
repaint();
}
// Обработка входа курсора мыши void mouseEntered(MouseEvent me) {
Глава 23. Обработка событий сохранить координаты = 0;
mouseY = 10;
msg = "Mouse entered.";
// msg = "Курсор мыши вошел
repaint();
}
// Обработка выхода курсора мыши
public void mouseExited(MouseEvent me) {
// сохранить координаты = 0;
mouseY = 10;
msg = "Mouse exited.";
// msg = "Курсор мыши вышел
repaint();
}
// Обработка нажатия кнопки void mousePressed(MouseEvent me) {
// сохранить координаты
mouseX = m e . g e t X O ;
mouseY = m e . g e t Y O ;
msg = "Down";
// msg = "Вниз
repaint();
}
// Обработка отпускания кнопки void mouseReleased(MouseEvent me) {
// сохранить координаты
mouseX = m e . g e t X O ;
mouseY = me.getY();
msg = "Up";
// msg = "Вверх
repaint();
}
// Обработка перетаскивания мышью
public void mouseDragged(MouseEvent me) {
// сохранить координаты
mouseX = m e . g e t X O ;
mouseY = m e . g e t Y O ;
msg = "*";
showStatus("Dragging mouse at " + mouseX + ", " +
// Перетаскивание мыши в " + mouseX + ",
repaint();
}
// Обработка движениям ы ш и .
public void mouseMoved(MouseEvent me) {
// Показать состояние mouse at " + m e . g e t X O + ", "
// Перемещение мыши в " + m e . g e t X O + ",
}
// Отобразить msg в окне аплета в текущей позиции X,Y
public void paint(Graphics g) {
g.drawstring(msg, mouseX, Пример работы этого аплета показан на рис. 23.1.
mouseY);
" + mouseY);
m e .g e t Y ());
" + m e .g e t Y ())

7 3 Часть II. Библиотека Java
Applet
Moving m ouse at 146, Рис. 23.1. Пример работы аплета, использующего обработчики событий мыши
Рассмотрим этот пример внимательнее. Класс
MouseEvents расширяет класс
Applet и реализует интерфейсы
MouseListener и
MouseMotionListener. Эти два интерфейса содержат методы, принимающие и обрабатывающие различные типы событий мыши. Обратите внимание на то, что аплет одновременно является и источником, и слушателем этих событий. Это работает, потому что класс
Component, применяющий методы
addMouseListener
() и
addMouseMotion-
Listener ()
, является суперклассом класса
Applet. Использование одного итого же объекта в качестве источника и слушателя событий типично для аплетов.
Внутри метода
init
() аплет регистрирует самого себя в качестве слушателя событий мыши. Это осуществляется методами
addMouseListener
() и
ad-
aMouseMotionListener ()
, которые, как уже упоминалось, являются членами класса
Component. Эти методы показаны ниже ad dMo use Lis te ne r (M o us e Li s te n er
ml)
voi d add Mou seM oti on Li s te n er ( Mo u se M ot i on L i st e ne r Здесь ml — ссылка на объект, принимающий события мыши, a mml — ссылка на объект, принимающий события перемещения мыши. В данной программе в обоих методах используется один и тот же объект.
Затем аплет реализует все методы, определенные в интерфейсах
Mouse­
Listener и
MouseMotionListener. Таким образом, существуют обработчики для всех событий мыши. Каждый из них обрабатывает собственное событие, аза тем возвращает управление.
Обработка событий клавиатуры
Для обработки событий клавиатуры, используется та же общая архитектура, что ив примере с событиями мыши, приведенном в предыдущем разделе. Отличие, конечно, в том, что здесь выбудете реализовывать интерфейс Прежде чем обращаться к примеру, полезно еще раз рассмотреть процесс извещения о клавиатурных событиях. При нажатии клавиши происходит событие
KEY_PRESSED. Это приводит к вызову обработчика событий
keyPressed ()
. При отпускании клавиши происходит событие
KEY_RELEASED и выполняется обработчик
key
Re
leased ()
. Если нажатие клавиши создает символ, то также происходит событие
KEY_TYPED и выполняется обработчик
keyTyped ()
. Таким образом, всякий раз, когда пользователь нажимает клавишу, происходит как минимум два, а то и три события. Если вас интересуют действительные символы, введенные с клавиатуры, то можете игнорировать информацию о нажатии и отпускании клавиш. Но если ваша программа должна обрабатывать специальные клавиши вроде клавиш
Глава 23. Обработка событий 3 со стрелками или функциональных клавиш, то их следует отслеживать в обработчике В следующем аплете демонстрируется клавиатурный ввод. Он отображает нажатые клавиши в окне аплета и демонстрирует в строке состояния, нажата клавиша или отпущена Использование обработчиков событий клавиатуры
import java.awt.*;
import java.awt.event.*;
import java.applet.*;
/*


*/
public class SimpleKey extends Applet
implements KeyListener {
String msg = "";
int X = 10, Y = 20; // координаты вывода void i n i t () {
addKeyListener(this);
}
public void keyPressed(KeyEvent ke) {
showStatus("Key Down");
// Клавиша нажата void keyReleased(KeyEvent ke) {
showStatus("Key U p " );
// Клавиша отпущена void keyTyped(KeyEvent ke) {
msg +
= k e .getKeyChar();
repaint();
}
// Отображение нажатых клавиш
public void paint(Graphics g) {
g.drawstring(msg, X, Y) Пример работы этого аплета показан на рис. 23.2.
i
Applet Viewer: SimpleKey
■ ДЕ И is a test.
Key Рис. 23.2. Пример работы аплета, использующего обработчики событий клавиатуры Зак 3030

7 3 Часть II. Библиотека Если хотите обрабатывать специальные клавиши, такие как клавиши со стрелками и функциональные клавиши, то следует реагировать на них в обработчике k e y P r e s s e d (). Такие клавиши в обработчике k ey T y p ed () недоступны. Чтобы идентифицировать эти клавиши, можно использовать коды виртуальных клавиш. Например, следующий аплет выводит имена некоторых специальных клавиш Использование некоторых кодов виртуальных клавиш
import j a v a .a w t .*;
import j a v a .a w t .event.*;
import java.applet.*;
/*


*/
public class KeyEvents extends Applet
implements KeyListener {
String msg = "";
int X = 10, Y = 20; // координаты вывода void i n i t () {
addKeyListener(this);
}
public void keyPressed(KeyEvent ke) {
showStatus("Key Down");
// Клавиша нажата
int key = k e .getKeyCode();
switch(key) {
case KeyEvent.VK_F1:
msg += "<
F1>";
break;
case KeyEvent.VK_F2:
msg += "<
F
2 >";
break;
case KeyEvent.VK _ F 3 :
msg +
= "";
break;
case KeyEvent.VK_PAGE_DOWN:
msg += "
";

break;
case KeyEvent.VK_PAGE_UP:
msg += "
";

break;
case KeyEvent.VK_LEFT:
msg +
= "";
// msg +
= "Стрелка влево
break;
case KeyEvent.VK_RIGHT:
msg += "";
// msg += "Стрелка вправо Клавиша отпущена
Глава 23. Обработка событий 3 9
public void keyTyped(KeyEvent ke) {
msg += k e .getKeyChar();
repaint();
}
// Отобразить нажатые клавиши
public void paint(Graphics g) {
g .drawstring(msg,
X, Y ) Пример работы этого аплета показан на рис. 23.3.
Applet ^Viewer: KeyEvent s '" „
I Applet


Key Рис. 23.3. Пример работы аплета, использующего некоторые коды виртуальных клавиш
Процедуры, показанные в приведенных примерах обработки событий мыши и клавиатуры, могут быть обобщены для обработки событий любого типа, включая события элементов управления. В последующих главах вы увидите множество примеров обработки событий других типов, но все они следуют одной и той же базовой структуре, что и только что описанные программы.
Классы адаптеров
В Java имеется специальное средство, называемое классом адаптера, который вне которых ситуациях упрощает реализацию обработчиков событий. Класс адаптера предлагает пустую реализацию всех методов интерфейса слушателя событий. Классы адаптеров удобны, когда вы хотите принимать и обрабатывать только некоторые события, обрабатываемые определенным интерфейсом слушателя. Вы можете определить новый класс для использования в качестве слушателя событий, расширив один из классов адаптеров и реализовав только те события, в которых вы заинтересованы.
Например, класс
MouseMotionAdapter имеет два метода
mouseDragged
() и
mouseMoved ()
, которые определены в интерфейсе
MouseMotionListener. Если вы заинтересованы только в событиях перетаскивания мыши, можете просто расширить класс
MouseMotionAdapter и переопределить метод
mouse­
Dragged
(). Пустая реализация метода
mouseMoved
() обработает события перемещения мыши за вас.
В табл. 23.10 перечислены часто используемые классы адаптеров пакета
j ava .
aw t .
event и отмечены интерфейсы, реализуемые каждым из них

7 4 Часть II. Библиотека Таблица 23.10. Часто используемые интерфейсы слушателей реализуемые классами адаптеров
Класс адаптера .<
^

- . > ,
. Интерфейс слушателя - ----- - -
: г г ouseListener
MouseMot ionAdapter
Mous
eMot i
onL
i
s
t В следующем примере демонстрируется применение адаптера. Он отображает сообщение в строке состояния средства просмотра аплетов, когда выполняется щелчок кнопкой мыши или перетаскивание. Однако все прочие события мыши игнорируются. Программа состоит из трех классов. Класс A d ap ter Demo расширяет класс A p p le t. Его метод i n i t () создает экземпляр класса MyMouseAdapter и регистрирует этот объект для получения уведомлений о событиях мыши. Также он создает экземпляр класса M yM ouseM otionAdapter и регистрирует его для получения уведомлений о событиях перемещения мыши. Оба конструктора принимают ссылку на аплет в качестве аргумента.
Класс MyMouse A d ap ter расширяет класс Mouse A d ap ter и переопределяет метод m o u se d ic k e d (). Все прочие события мыши игнорируются кодом, унаследованным от класса Mouse A d ap ter. Класс M yM ouseM otionAdapter расширяет класс M ouseM otionA dapter и переопределяет метод m ouseD ragged (). Другое событие перемещения мыши игнорируется кодом, унаследованным от класса Мои s еМо t i onAdap t e r Обратите внимание на то, что оба класса слушателей событий сохраняют ссылку на аплет. Эта информация предоставляется в виде аргумента и используется позднее для вызова метода sh o w S ta tu s ().
// Демонстрация применения адаптера j a v a .a w t .*;
import j a v a .a w t .event.*;
import java.applet.*;
/*


*/
public class AdapterDemo extends Applet {
public void init() {
addMouseListener(new MyMouseAdapter(this));
addMouseMotionListener(new MyMouseMotionAdapter(this));
}
}
class MyMouseAdapter extends MouseAdapter {
AdapterDemo adapterDemo;
public MyMouseAdapter(AdapterDemo adapterDemo) {
t his.adapterDemo = adapterDemo;
}
// Обработка щелчка мыши void mouseClicked(MouseEvent me) {
Глава 23. Обработка событий 4 1
adapterDemo.showStatus("Mouse clicked");
// Щелчок кнопкой мыши MyMouseMotionAdapter extends MouseMotionAdapter {
AdapterDemo adapterDemo;
public MyMouseMotionAdapter(AdapterDemo adapterDemo) {
t his.adapterDemo = adapterDemo;
}
// Обработка перетаскивания мыши
public void mouseDragged(MouseEvent me) {
adapterDemo.showStatus("Mouse dragged");
// Перетаскивание мышью");
}
}
Как видите, отсутствие необходимости реализовать все методы, определенные интерфейсами
Mous
еМо
t
ionLi
s
t
ener и
MouseLi
s
t
ener
, позволяет сэкономить значительное количество усилий и избавляет ваш код от перегрузки пустыми методами. В качестве упражнения можете попробовать переписать один из приведенных ранее примеров, обрабатывающих клавиатурный ввод, с использованием класса Вложенные классы

Основы вложенных классов были описаны в главе 7. Сейчас вы убедитесь, насколько они важны. Напомним, что вложенный класс — это класс, определенный внутри другого класса или даже внутри выражения. В настоящем разделе проиллюстрировано использование вложенных классов для упрощения кода в случае классов адаптеров событий.
Чтобы понять выгоду, которую обеспечивают вложенные классы, рассмотрим аплет, приведенный в следующем листинге. В нем не используются вложенные классы. Его назначение — отобразить строку
"Mouse Pressed" в строке состояния средства просмотра аплетов или браузера, когда нажата кнопка мыши. В этой программе присутствует еще два класса верхнего уровня. Класс
MousePressedDemo расширяет класса класс
MyMouseAdapter
— класс
MouseAdapter. Метод
init
() в классе
MousePressedDemo создает экземпляр класса
MyMouseAdapter и предоставляет этот объект в качестве аргумента методу
addMouseListener (Обратите внимание на то, что ссылка на аплет выступает в качестве аргумента конструктора класса
MyMouseAdapter. Эта ссылка сохраняется в переменной экземпляра для последующего использования методом
mousePressed ()
. Когда нажимается кнопка мыши, вызывается метод
showStatus
() аплета через сохраненную ссылку на аплет. Другими словами, метод
showStatus
() вызывается относительно ссылки на аплет, сохраненной в объекте класса
MyMouseAdapter.
/ / В этом аплете НЕ используются вложенные классы
import java.applet.*;
import j a v a .a w t .event.*;
/*


*/
public class MousePressedDemo extends Applet {
}
}

7 4 Часть II. Библиотека Java
public void in i t () {
addMouseListener(new MyMouseAdapter(this));
}
}
class MyMouseAdapter extends MouseAdapter {
MousePressedDemo mousePressedDemo;
public MyMouseAdapter(MousePressedDemo mousePressedDemo) {
this.mousePressedDemo = mousePressedDemo;
}
public void mousePressed(MouseEvent me) {
mousePressedDemo.showStatus("Mouse Pressed");
// Кнопка мыши нажата");
}
}
В следующем листинге показано, как можно усовершенствовать предыдущую программу, используя вложенный класс. Здесь класс
InnerClassDemo
— это класс верхнего уровня, расширяющий класс
Applet. Класс
MyMouseAdapter — это вложенный класс, расширяющий класс
MouseAdapter. Поскольку класс
MyMouseAdapter определен внутри области видимости класса
InnerClassDemo, он имеет доступ ко всем переменными методам, находящимся в контексте этого класса. Таким образом, метод
mousePressed
() может вызывать метод
show­
Status
() непосредственно. Больше нет необходимости делать это через сохраненную ссылку на аплет. А потому ненужно и передавать конструктору
MyMouseAdapter
() ссылку на вызывающий объект Демонстрация применения вложенного класса
import java.applet.*;
import j a v a .a w t .event.*;
/*


*/
public class InnerClassDemo extends Applet {
public void init() {
addMouseListener(new MyMouseAdapter());
}
class MyMouseAdapter extends MouseAdapter {
public void mousePressed(MouseEvent me) {
showStatus("Mouse Pressed");
// Кнопка мыши нажата");
}
}
}
Анонимные вложенные классы
Анонимный вложенный класс — это класс, которому не назначено имя. В этом разделе проиллюстрируем, как анонимный вложенный класс может облегчить написание обработчиков событий. Рассмотрим аплет, показанный в следующем листинге. Как и раньше, его назначение — отобразить строку
"Mouse Pressed" в строке состояния средства просмотра аплетов или браузера, когда нажата кнопка мыши Демонстрация применения анонимного вложенного класса
import java.applet.*;
import j a v a .a w t .event.*;
/*
Глава 23. Обработка событий
7 4 3


*/
public class AnonymousInnerClassDemo extends Applet {
public void init() {
addMouseListener(new MouseAdapter() {
public void mousePressed(MouseEvent me) {
showStatus("Mouse Pressed");
// Кнопка мыши нажата) В этой программе присутствует только один класс верхнего уровня —
Anony­
mous
InnerC
las
sDemo. Метод
init (
) вызывает метод
addMouseListener ()
. Его аргументом служит выражение, определяющее и создающее экземпляр анонимного вложенного класса. Давайте тщательно проанализируем это выражение.
Синтаксис
new MouseAdapter
( ) { . . . } указывает компилятору, что код между фигурными скобками определяет анонимный вложенный класс. Более того, этот класс расширяет класс
MouseAdapter. Этот новый класс не имеет имени, но его экземпляр автоматически создается при выполнении данного выражения.
Поскольку анонимный вложенный класс определен внутри контекста класса
AnonymousInnerClassDemo, он имеет доступ ко всем переменными методам, находящимся в контексте данного класса. Поэтому он может вызывать метод
show­
Status
() непосредственно.
Как видите, именованные и анонимные вложенные классы решают некоторые досадные проблемы простыми эффективным способом. Они также позволяют вам создавать более эффективный код

1   ...   62   63   64   65   66   67   68   69   ...   90


написать администратору сайта