Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Part6(9-прилож)+++а.doc
Скачиваний:
0
Добавлен:
01.05.2025
Размер:
1.82 Mб
Скачать

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

Классы адаптеров упрощают обработку событий, поскольку уже наследуют интерфейсы событий и реализуют обработчики по умолчанию. Классы адаптеров ComponentAdapter, ContainerAdapter, FocusAdapter, KeyAdapter, MouseAdapter, MouseMotionAdapter и WindowAdapter реализуют соответственно интерфейсы прослушивания событий ComponentListener, ContainerListener, FocusListener, KeyListener, MouseListener, MouseMotionListener и WindowListener. Для использования класса адаптера необходимо создать новый класс объекта приёмника, который наследует требуемый класс адаптера. В созданном классе можно переопределить требуемые обработчики интерфейса. Остальные обработчики могут быть оставлены без внимания, поскольку они уже реализованы в наследуемом классе адаптера. Затем создаются объект-источник события и объект нашего нового класса с переопределённым в нём нужным обработчиком. И, наконец, к объекту источнику его функция addTypeListener () добавляет объект приёмника. Из примера 9.5.3.1 видно, насколько упрощается программа. Сравните варианты 5 и 6 примера 9.5.3.1 с вариантом 4 примера 9.5.2. В классе Listener теперь отпала необходимость обязательной реализации всех обработчиков интерфейса MouseListener. Класс Listener упростился, но наследование класса MouseAdapter дозволяет для этого класса Listener теперь наследование только интерфейсов.

Программу можно ещё упростить, применив внутренние или анонимные классы, о чём рассказано в разделе 9.5.4.

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

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

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

import java.awt.*;

import java.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);

this.setTitle ("Hello");

this.addMouseListener(ls);

}

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

{

MainClass mC= new MainClass ( );

mC.show ( );

}

}

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

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

import java.awt.*;

import java.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 ( )

{

this.setSize (400, 200);

this.setTitle ("Hello");

this.addMouseListener (new Listener ( ));

}

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

{

MainClass mC= new MainClass ( );

mC.show ( );

}

}

/*

Result:

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

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

*/

Java и J#. Если бы в вариантах 5 и 6 программы класс Listener приёмника наследовал интерфейс MouseListener, то пришлось бы описать в классе все интерфейсные функции этого интерфейса, поскольку наследование интерфейса требует это. То есть поступить так, как в примере 9.5.2. Но класс Listener примера 9.5.3.1 наследует класс MouseAdapter адаптера, который наследует интерфейс MouseListener и уже реализовал все его интерфейсные функции по умолчании. Это позволило переопределить в классе Listener только нужную нам функцию mousePressed().

Подписка на событие мыши в вариантах 5 и 6 отличается. В варианте 5 в теле конструктора MainClass() создаётся объект ls приёмника (слушателя) в куче, и функция addMouseListener использует эту ссылку ls. В варианте 6 ссылка автоматически создаётся в качестве аргумента в результате создания объекта приёмника класса Listener.

Соседние файлы в предмете [НЕСОРТИРОВАННОЕ]