Классы-адаптеры

Java обеспечивает специальное средство, называемое классом адаптера (adapter class), которое может упростить в некоторых ситуациях создание обработчиков событий. Класс адаптера (или просто "адаптер") обеспечивает пустую реализацию всех методов в интерфейсе прослушивания событий. Класс полезен, когда вы хотите принимать и обрабатывать только некоторые из событий, предоставляемые конкретным интерфейсом прослушивания.Т.Е. не нужно создавать код ВСЕХ методов, реализуемых интерфейсом прослушивания событий. Для этого нужно определить новый класс, действующий как блок прослушивания событий, расширяя один из имеющихся (в пакекте java.awt.event) адаптеров и реализуя только те события, которые требуется обрабатывать.

Например, классMouseMotionAdapter имеет два метода mouseDragged() и mouseMoved(). Сигнатуры этих пустых методов точно такие же, как в интерфейсе MouseMotionListener. Если бы вы были заинтересованы только в событиях перетаскивания мыши, то могли бы просто расширить адаптер MouseMotionAdapter и реализовать метод mouseDragged(). События же перемещения мыши обрабатывала бы пустая реализация метода mouseMoved().

Табл. см. ниже перечисляет различные классы-адаптеры, которые определены в пакете java.awt.event, и указывает те интерфейсы прослушивания, которые каждый из них реализует.

Таблица Интерфейсы прослушивание событий, реализованные

с помощью классов адаптеров

Класс-адаптер Интерфейс прослушивания событий
ComponentAdaptеr ComponentListener
ContainerAdapter ContainerListener
FocusAdapter FocusListener
KeyAdapter KeyListener
MouseAdapter MouseListener
MouseMotionAdapter MouseMotionListener
WindowAdapter WindowListener

Следующий пример демонстрирует использование класса-адаптера. Он отображает сообщение в строке состояния программы просмотра аплета или браузера, когда выполняется перетаскивание мыши или щелчок. Однако все другие события мыши по умолчанию игнорируются. Программа содержит три класса. Класс AdapterDemo расширяет Applet. Его метод init() создает экземпляр MyMouseAdapter и регистрирует этот объект для приема уведомлений от mouse-событий. Он также создает экземпляр MyMouseMotionAdapter и регистрирует этот объект для приема уведомлений событий MouseMotion (движения мыши). В качестве аргумента оба конструктора получают ссылку на данный аплет.

Класс MyMouseAdapter реализует метод mouseCiicked(). Другие события мыши "молча" игнорируются кодом, унаследованным от класса MouseAdapter.

Класс MyMouseMotionAdapter реализует метод mouseDragged(). Другое событие движения мыши игнорируется кодом, унаследованным от класса

MouseMotionAdapter.

Обратите внимание, что оба класса прослушивания событий хранят ссылку на данный аплет. С помощью ссылки this эта информация передается в оба конструктора и используется позже для вызова метода showStatus ().

//package adapter;

// Демонстрирует адаптер.

import java.awt.*;

import java.awt.event.*;

import java.applet.*;

/*

<applet code="AdapterDemo" width=300 height=100> </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) {

this. adapterDemo = adapterDemo;

}

// Обработка щелчка мыши.

public void mouseClicked(MouseEvent me) {

adapterDemo.showStatus("Mouse clicked");

}

}

class MyMouseMotionAdapter extends MouseMotionAdapter {

AdapterDemo adapterDemo;

public MyMouseMotionAdapter(AdapterDemo adapterDemo) {

this. adapterDemo = adapterDemo;

}

// Обработка перетаскивания мыли.

public void mouseDragged(MouseEvent me) {

adapterDemo.showStatus("Mouse dragged");

}

}

Глядя на программу, можно заметить, что отказ от необходимости реализовывать все методы, определенные интерфейсами MouseMotionListener и MouseListener значительно сокращает объем программы, освобождая код от загромождения пустыми методами. В качестве упражнения можно было бы попробовать переписать один из примеров ввода с клавиатуры, показанный ранее так, чтобы он использовал класс KeyAdapter.


Понравилась статья? Добавь ее в закладку (CTRL+D) и не забудь поделиться с друзьями:  



double arrow
Сейчас читают про: