Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Медведев_С++_CLI_C#_Java_J#.doc
Скачиваний:
3
Добавлен:
01.07.2025
Размер:
5 Мб
Скачать
☆

10.5.3. Обработка событий мыши на языке Java, используя классы адап-

теров

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

интерфейсы событий и реализуют обработчики по умолчанию. Классы

адаптеров ComponentAdapter, ContainerAdapter, FocusAdapter, KeyAdapter,

MouseAdapter, MouseMotionAdapter и WindowAdapter реализуют соответст-

венно интерфейсы прослушивания событий ComponentListener, ContainerListener,

FocusListener, KeyListener, MouseListener, MouseMotionListener и WindowListener.

Для использования класса адаптера необходимо создэть новый

класс объекта приёмника, который наследует требуемый класс адаптера. В

созданном классе можно переопределить требуемые обработчики интерфей-

са. Остальные обработчики могут быть оставлены без внимания, поскольку

они уже реализованы в наследуемом классе адаптера. Затем создаются объ-

ект-источник события и объект нашего нового класса с переопределённым в

нём нужным обработчиком. И, наконец, к объекту источнику его функция

add7>>peListener () добавляет объект приёмника. Из примера 10.S.3.1 видно,

насколько упрощается программа. Сравните варианты 5 и 6 примера 10.S.3.1

с вариантом 4 примера 10.5.2. В классе Listener теперь отпала необходимость

обязательной реализации всех обработчиков интерфейса MouseListener.

Класс Listener упростился, но наследование класса MouseAdapter дозволяет

для этого класса Listener теперь наследование только интерфейсов.

Программу можно ещё упростить, применив внутренние или анонимные

классы, о чём рассказано в разделе 10.5.4.

Пример 10.5.3.1. Обработка событий мыши на Java, используя классы

адаптеров.

///////////////

// Java и J# Вариант 5

Importjava.Awt.*;

Importjava.Awt.Event.*;

class Listener extends MouseAdapter

{

// Выполнить предопределённый обработчик mousePressed мыши

public void mousePressed (MouseEvent mE)

{

System.out.println ("Mouse: x= " + mE.getX ( )

+ " y= " + mE.getY( ));

>

>

// Класс прикладного окна

class MainClass extends Frame

{

public MainClass ()

{

Listener ls= new Listener ( );

this.setSize (400, 200);

thls.setTltle ("Hello");

this.addMouseListener(is);

>

public static void main ( ) // Главная функция

{

MainClass mC= new MainClass ();

mC.show ();

>

>

///////////////

// Java и J# Вариант 6

Importjava.Awt.*;

Importjava.Awt.Event.*;

class Listener extends MouseAdapter

{

// Выполнить предопределённый обработчик mousePressed мыши

public void mousePressed (MouseEvent mE)

{

System.out.println ("Mouse: x= " + mE.getX ( )

+ " y= " + mE.gctY( ));

}

// Класс прикладного окна

class MainClass extends Frame

{

public MainClass ( )

<

this.setSize (400, 200);

this.setTitle ("Hello");

this.addMouseListener (new Listener ( ));

>

pubiic static void main ( ) /'/' Главная функция

{

MalnClass mC= new MainClass ( );

mC.show ( );

>

/>*

Result:

При каждом нажатии на клавишу мыши в прикладном окне выдаётся на консоль

строка вида

Mouse: x= 10 y= 55, где x, у - координаты носика мыши *,

Java и J#. Если бы в вариантах 5 и 6 программы класс Listener приёмника

наследовал интерфейс MouseListener, то пришлось бы описать в классе все

интерфейсные функции этого интерфейса, поскольку наследование интер-

фейса требует это. То есть поступить так, как в примере 10.5.2. Но класс Listener

примера 10.5.3.1 наследует класс MouseAdapter адаптера, который на-

следует интерфейс MouseListener и уже реализовал все его интерфейсные

функции по умолчании. Это позволило переопределить в классе Listener

только нужную нам функцию mousePressed().

Подписка на событие мыши в вариантах 5 и 6 отличается. В варианте 5 в теле

конструктора MainClass() создаётся объект ls приёмника (слушателя) в куче,

и функция addMouseListener использует эту ссылку ls. В варианте 6 ссылка

автоматически создаётся в качестве аргумента в результате создания объекта

приёмника класса Listener.