Книга: Основы программирования с Java
Назад: Вопросы
Дальше: Демонстрация Event Driven программирования

Интерфейсы

Сейчас я немного отклонюсь в сторону, потому что слушатель событий является Java интерфейсом.

Рассмотрение интерфейсов выходит за рамки этого курса, так что я обсужу эту тему очень кратко.

В основном и целом, интерфейс является группой связанных методов с пустым содержимым.

И эти методы должны быть определены любым классом, который реализует этот интерфейс.

Объявление интерфейса производится с помощью ключевого слова interface. Это похоже на объявление класса, за исключением того, что методы объявлены без тел методов.





Он также не содержит никаких переменных экземпляра или статических переменных, за исключением того, что допускаются константы static final.

Здесь приведен пример, показывающий объявление для интерфейса ActionListener.

Как вы можете видеть, метод actionPerfomed объявлен с одним параметром типа ActionEvent, но тело метода отсутствует.

Обратите внимание, что даже нет пары фигурных скобок после метода.

Давайте рассмотрим другой пример интерфейса.







В этом примере, интерфейс Shape описывает функции, которые являются общими для всех форм.

Интерфейс определяет два абстрактных методов, а именно методы площади и периметра.

Эти методы должны вычислить свойства, общие для всех форм.

Но тело методов отсутствует, потому что реализация конкретного расчета может быть различной для разных форм.

Здесь реализовано вычисление для прямоугольника.

Как вы можете видеть, что тело методов площади и периметра обеспечивает конкретный расчет.

В случае площади, вы просто умножаете ширину на высоту.

Когда вы вычисляете периметр, вы складываете ширину и высоту вместе, а затем умножаете на 2.

Аналогично, реализация для круга также здесь представлена.

В этом случае площадь круга вычисляется как пи умножить на квадрат радиуса.

Аналогично также может быть создана реализация для других форм.

Модель делегации событий

Давайте вернемся к модели делегации событий и обсудим более детально, как работает этот механизм.

Предположим, у нас есть событие под названием Abc.







Тогда класс AbcSource будет иметь метод с именем addAbcListener с параметром типа AbcListener для объекта-источника, чтобы регистрировать своих слушателей таким образом, что может быть создан список слушателей.

Вызов этого метода позволяет классу источника знать, каких слушателей он должен уведомить, когда происходит событие.

Класс AbcListener будет иметь один или несколько методов с именем типа AbcPerformed, формируемым из типа события и вида выполняемого действия, которое принимает AbcEvent объект в качестве параметра.

Метод должен реализовать логику, каким образом это событие должно быть обработано.

Я вернусь к реализации этих методов позже.







Когда происходит событие Abc, такое как клик мыши или нажатие мыши, метод AbcPerformed будет вызываться классом AbcSource и посылать ему объект AbcEvent, который инкапсулирует всю необходимую информацию об активации.

Например, (х, у) положение курсора мыши, введенный текст, и так далее.

Все слушатели, заинтересованные в событии, должны реализовать слушатель событий.

Класс Event Listener представляет собой интерфейс Java, который содержит набор методов, которые будут реализованы.







Слушатели должны иметь свои собственные реализации для всех абстрактных методов, объявленных в интерфейсе слушателя событий.

Таким образом, слушатели смогут реагировать на эти события должным образом.

В этом примере, слушатель события или обработчик называется MyListener и заинтересован в событии Abc. Он должен реализовать интерфейс AbcListener, который содержит метод, называемый AbcPerformed.

Класс MyListener должен обеспечить реализацию внутри определения класса для метода AbcPerformed.

Давайте посмотрим на простой пример, чтобы проиллюстрировать, как работает этот механизм.







В этом примере, имя слушателя событий, который мы собираемся использовать, это MyListener.

И мы заинтересованы в событии MouseEvent, в частности, в mouseClicked. Поэтому интерфейс, который мы собираемся реализовать это MouseListener.

Обратите внимание, что мы должны импортировать MouseListener и класс MouseEvent из пакета java.awt.event.

Остальные два выражения импорта для классов Canvas и ColorImage, которые мы использовали много-много раз.

В конструкторе, в дополнение к созданию холста, мы также устанавливаем холст в качестве источника событий, добавив MouseListener, потому что мы заинтересованы в событиях, генерируемых мышью.

В частности, мы заинтересованы в щелчке мыши и здесь есть метод в интерфейсе MouseListener называемый mouseClicked.

Этот метод будет вызываться, когда пользователь нажимает на кнопку мыши и информация о событии щелчка мыши инкапсулируется в параметре, который является объектом MouseEvent.

Как упоминалось ранее, методы в интерфейсе не реализованы в объявлении интерфейса.

И реализация того, как это событие mouseClicked предполагается быть обработанным, определена в этой программе.

То, что мы пытаемся сделать здесь, это просто попробовать отобразить happyFace изображение на холсте в месте, где произошел щелчок мыши.

Таким образом, мы сначала открываем happyFace изображение.

Расположение щелчка мыши можно получить из объекта события с помощью e.getX и e.getY.

Остальная часть выражения image.getWidth/2 и image.getHeight/2 только пытается произвести регулировку положения, так что изображение отображается в центре, где мышь щелкнула, а не в углу.

После того как нужное место получено, изображение отображается на холсте.

Кажется, что мы сделали все, что мы должны были сделать, кроме того, что, как я уже говорил, когда мы обсуждали интерфейс, все методы в интерфейсе должны быть определены в классе, который реализует интерфейс, даже если программа не собирается использовать какой-любо из них.

В случае интерфейса MouseListener, существует четыре другие методы, в дополнение к mouseClicked, а именно mousePressed и mouseReleased, фактически комбинированное действие mousePressed и mouseReleased приведет к щелчку мыши, другие методы mouseEntered и mouseExited указывают, находится ли мышь в пределах или за пределами области источника событий, в данном случае, на холсте.

Назад: Вопросы
Дальше: Демонстрация Event Driven программирования