Java: руководство для начинающих
Шрифт:
где Тип — это имя события, а элемент — ссылка на приемник события. Например, метод, регистрирующий приемник событий от клавиатуры, объявляется как addKeyListener . А для регистрации приемника событий от перемещения мыши служит метод addMouseMotionListener . При наступлении события все приемники оповещаются и получают копию, описывающую его объект.
Источник должен также предоставлять метод, позволяющий отменить регистрацию приемника событий определенного вида. Ниже приведена общая форма объявления такого метода. public void removeTnnListener(TmiListener элемент)
Здесь, как и прежде, Тип — это имя события, а элемент — ссылка на его приемник. Например, для того чтобы удалить приемник событий от клавиатуры, следует вызвать метод removeKeyListener.
Методы, добавляющие или удаляющие приемники событий, предоставляются источниками, формирующими эти события. Например, в классе Component предоставляются методы, позволяющие добавлять или удалять приемники событий от клавиатуры и мыши. Приемники событий
Приемник — это объект, уведомляемый о наступлении события. К нему предъявляются
Методы, получающие уведомления о событиях из библиотеки AWT и обрабатывающие их, определены в интерфейсах, относящихся к пакету j ava. awt. event. Например, в интерфейсе MouseMotionListener объявлены методы, получающие уведомления о перемещении и перетаскивании мыши. Всякий объект, реализующий этот интерфейс, может получать уведомления о подобных событиях и обрабатывать их. Классы событий
Классы, представляющие события, положены в основу механизма обработки событий в Java. Они образуют иерархическую структуру, на вершине которой находится класс EventObject, относящийся к пакету j ava. util. Он служит суперклассом для всех событий. Класс AWTEvent, относящийся к пакету j ava. awt, является подклассом, производным от класса EventOb j ect. Он, в свою очередь, выступает в роли родительского класса для всех событий из библиотеки AWT, используемых в модели делегирования событий.
В пакете java.awt.event определено несколько видов событий, формируемых различными элементами пользовательского интерфейса. Краткое описание некоторых из наиболее употребительных событий подобного рода приведено в табл. 14.2.
Таблица 14.2. Основные классы событий из пакета java.awt.event Класс события Описание ActionEvent Формируется после щелчка на кнопке, двойного щелчка на элементе списка или выбора пункта меню AdjustmentEvent Формируется при манипулировании полосой прокрутки ComponentEvent Формируется, когда компонент становится видимым или невидимым, а также при изменении его размеров и перемещении ContainerEvent Формируется, когда компонент добавляется в контейнер или удаляется из него FocusEvent Формируется, когда компонент получает или теряет фокус ввода InputEvent Абстрактный суперкласс для всех классов событий, связанных с вводом данных ItemEvent Формируется по щелчку на флажке или элементе списка, а также наступает при выборе или отмене выбора пункта меню KeyEvent Формируется при вводе данных с клавиатуры MouseEvent Формируется при перемещении или перетаскивании мыши, а также по нажатию, отпусканию или щелчку кнопкой мыши или же в том случае, когда курсор мыши наводится на элемент интерфейса или перемещается с него TextEvent Формируется при изменении содержимого области или поля ввода текста WindowEvent Формируется, если окно делается активным или неактивным, сворачивается или разворачивается, открывается или закрывается либо покидается Интерфейсы приемников событий
Приемники событий получают уведомления об их наступлении. Приемники событий из библиотеки AWT реализуют один или несколько интерфейсов, относящихся к пакету java.awt.event. При наступлении события источник вызывает соответствующий метод, определенный приемником, и передает ему объект события в качестве аргумента. В табл. 14.3 перечислены наиболее употребительные интерфейсы приемников событий и кратко описаны объявленные в них методы.
Таблица 14.3. Наиболее употребительные интерфейсы приемников событий Интерфейс Описание ActionListener Определяет один метод для получения событий действий. Такого рода события наступают при нажатии кнопки, выборе пункта меню и т.д. AdjustmentListener Определяет один метод для получения событий настройки, подобных тем, которые наступают при манипулировании полосой прокрутки ComponentListener Определяет четыре метода для выявления факта сокрытия, показа, изменения размеров или перемещения компонента пользовательского интерфейса ContainerListener Определяет два метода для выявления факта добавления компонента в контейнер или удаления из него FocusListener Определяет два метода для выявления факта получения и потери компонентом фокуса ввода ItemListener Определяет один метод для выявления факта изменения состояния элемента пользовательского интерфейса. Событие от элемента может формироваться, например, флажком KeyListener Определяет три метода для выявления нажатия, отпускания клавишии ввода с клавиатуры MouseListener Определяет пять методов для выявления щелчка кнопкой мыши, ее нажатия и отпускания, а также наведения курсора мыши на элемент пользовательского интерфейса или перемещения с него MouseMotionListener Определяет два метода для выявления факта перемещения или перетаскивания мыши MouseWheelListener Определяет один метод для выявления факта прокрутки колесика мыши TextListener Определяет один метод для выявления факта изменения текстового значения WindowListener Определяет семь методов для выявления факта открытия и закрытия, сворачивания и разворачивания, активизации и деактивизации или покидания окна Применение модели делегирования событий
А теперь, когда вы имеете общее представление о модели делегирования событий, перейдем к вопросам ее практического применения. Создавать апплеты, используя эту модель, совсем не трудно. По существу, написание кода для обработки событий сводится к следующему.
Реализация соответствующего интерфейса в приемнике событий нужного вида.
Написание кода для регистрации приемника событий, а если потребуется, то и отмены его
регистрации. Не следует, однако, забывать, что источник, как правило, может формировать несколько видов событий. И для каждого из этих видов событий требуется регистрация отдельного приемника. Кроме того, один объект можно зарегистрировать для приема на обработку событий нескольких видов, но тогда он должен реализовать все интерфейсы, соответствующие этим видам событий.Для того чтобы стало понятнее, как пользоваться моделью делегирования событий на практике, рассмотрим простой пример, в котором обрабатывается одни из самых распространенных видов событий: события от мыши. Этот пример демонстрирует порядок обработки элементарных событий от мыши. (Следует также иметь в виду, что обрабатывать можно и события от прокрутки колесика мыши. Но эта возможность оставляется вам в качестве упражнения для самостоятельного выполнения.) Обработка событий от мыши
Для обработки событий от мыши следует реализовать интерфейсы MouseListener и MouseMotionListener. В интерфейсе MouseListener объявлено пять методов. По щелчку кнопкой мыши вызывается метод mouseClicked . Если курсор мыши наводится на компонент пользовательского интерфейса, вызывается метод mouseEntered , а если курсор мыши перемещается с этого компонента — метод mouseExited . Методы mousePressed и mouseReleased вызываются, когда кнопка мыши нажимается и отпускается соответственно.
Ниже приведены общие формы объявления упомянутых выше методов. void mouseClicked(MouseEvent те) void mouseEntered(MouseEvent me) void mouseExited(MouseEvent me) void mousePressed(MouseEvent me) void mouseReleased(MouseEvent me)
В интерфейсе MouseMotionListener объявлены два метода. Метод mouseDragged многократно вызывается при перетаскивании мыши, когда нажата ее левая кнопка. А обычное перемещение мыши приводит к такому же многократному вызову метода mouseMoved . Ниже приведены общие формы объявления этих методов. void mouseDragged(MouseEvent те) void mouseMoved(MouseEvent me)
Событие описывается объектом типа MouseEvent, передаваемым каждому из методов в качестве параметра те. В классе MouseEvent определен целый ряд методов, которые можно использовать для получения подробных сведений о наступившем событии. Вероятно, наиболее употребительными в классе MouseEvent являются методы getx и getY , возвращающие координаты текущего положения курсора мыши (относительно окна) в момент наступления события. Ниже приведены общие формы объявления этих методов. int getX int getY
В примере, приведенном в следующем разделе, эти методы будут использованы для отображения сведений о текущем положении курсора мыши. Простой пример апплета, демонстрирующий обработку событий от мыши
В этом разделе представлен пример апплета, в котором обрабатываются элементарные события от мыши, а в строке состояния отображаются координаты текущего положения курсора мыши. При нажатии кнопки мыши в месте расположения курсора на экран выводится слово "Down" (Нажато), а при отпускании кнопки — слово "Up" (Отпущено). И наконец, по щелчку кнопкой мыши в верхнем левом углу окна апплета появляется сообщение "Mouse clicked" (Произведен щелчок кнопкой мыши).
Когда курсор мыши наводится на окно апплета или отводится от него, в левом верхнем его углу выводится соответствующее сообщение. При перетаскивании курсора мыши его сопровождает символ *. Кроме того, при нажатии и отпускании кнопки мыши или перетаскивании курсора координаты его текущего положения сначала сохраняются в переменных mouseX и mouseY, а затем используются в методе paint для вывода сообщения в той точке экрана, где произошло событие от мыши. // Демонстрация обработки событий от мыши, import java.awt.event.*; import java.applet.*; /* <applet code="MouseEvents" width=300 height=100> </applet> */ public class MouseEvents extends Applet implements MouseListener, MouseMotionListener { String msg = ""; int mouseX = 0, mouseY =0; // Координаты курсора мыши public void init { // Этот класс регистрируется в качестве приемника событий от мыши. addMouseListener(this); addMouseMotionListener(this); } // обработать событие, наступающее по щелчку кнопкой мыши // Этот и другие методы обработки событий вызываются при // наступлении разных событий от мыши. public void mouseClicked(MouseEvent me) { mouseX = 0; mouseY = 10; msg = "Mouse clicked."; repaint; } // обработать событие, наступающее при наведении курсора // мыши на компонент пользовательского интерфейса public void mouseEntered(MouseEvent me) { mouseX = 0; mouseY = 10; msg = "Mouse entered."; repaint; } // обработать событие, наступающее при отведении курсора // мыши от компонента пользовательского интерфейса public void mouseExited(MouseEvent me) { mouseX = 0; mouseY = 10; msg = "Mouse exited."; repaint; } // обработать событие, наступающее при нажатии кнопки мыши public void mousePressed(MouseEvent me) { // сохранить координаты текущего положения курсора mouseX = me.getX; mouseY = me.getYO; msg = "Down"; repaint; } // обработать событие, наступающее при отпускании кнопки мыши public void mouseReleased(MouseEvent me) { // сохранить координаты текущего положения курсора mouseX = me.getXO; mouseY = me.getYO; msg = "Up"; repaint; } // обработать событие, наступающее при перетаскивании курсора мыши public void mouseDragged(MouseEvent me) { // сохранить координаты текущего положения курсора mouseX = me.getXO; mouseY = me.getYO; msg = "*"; . showStatus("Dragging mouse at " + mouseX + ", " + mouseY); repaint; } // обработать событие, наступающее при перемещении курсора мыши public void mouseMoved(MouseEvent me) { // отобразить текущее положение курсора в строке состояния showStatus("Moving mouse at " + me.getXO + "t " + me.getY ) ; } // отобразить сообщение из переменной msg в окне апплета // по координатам текущего положения курсора public void paint(Graphics g) { g.drawString(msg, mouseX, mouseY); } }