Читайте также:
|
|
Многие из интерфейсов слушателей событий содержат многочисленные методы. Например, MouseListener и MouseMotionListener. Так как класс реализующий интерфейс должен определить все методы из данного интерфейса, но не всегда требуется определять каждый метод интерфейса слушателя событий. Поэтому в пакетах java. awt. event и javax.swing.event реализованы классы адаптеров слушателей событий. Класс адаптера реализует интерфейс и по умолчанию определяет каждый метод в интерфейсе с пустым типом метода.
Таблица 20.1
классы адаптеры | реализуемые интерфейсы |
ComponentAdapter | ComponentListener |
ContainerAdapter | ContainerListener |
FocusAdapter | FocusListener |
KeyAdapter | KeyListener |
MouseАdapter | MouseListener |
MouseMotionAdapter | MouseMotionListener |
WindowAdapter | WindowListener |
Вызов метода без указания ссылки на объект и “.” интерпретируется как вызов метода объекта (this), т.е. метод вызывается для данного экземпляра класса во время выполнения программы, например, addWindowListener (andCloser).
Программист может расширить класс адаптера посредством наследования реализации по умолчанию каждого метода с последующим переопределением методов, необходимых для обработки событий. Реализация каждого метода по умолчанию в классе адаптера имеет пустое тело. Это именно то, что мы делали в каждом приложении, расширяя класс JFrame и определяя метод windowCIosing для обработки события закрытия окна и завершения приложения.
Рассмотрим приложение, которое использует обработчик события mouseDragged для создания простой программы для рисования, методом перетаскивания мыши в окне приложения. В этом примере интерфейс MouseMotionListener реализован как подкласс адаптера MouseMotionAdapter.
// Painter.java
1 import java.awt.*;
2 import java.awt.event.*;
3 import javax.swing.*;
4 public class Painter extends JFrame{
5 private int xVal=-10,yVal=-10;
6 public Painter(){
6 super("risovanie");
7 getContentPane().add(new Label("mouse"),
BorderLayout.SOUTH);
8 addMouseMotionListener(
9 new MouseMotionAdapter(){
10 public void mouseDragged(MouseEvent event){
11 xVal=event.getX();
12 yVal=event.getY();
13 repaint();
14 }
15 }
16);
17 setSize(300,150);
18 setVisible(true);
19 }
20 public void paint(Graphics g){
21 g.setColor(Color.red);
22 g.fillOval(xVal,yVal,8,8);
23 }
24 public static void main(String args[]){
25 Painter app=new Painter();
26 app.addWindowListener(
27 new WindowAdapter(){
28 public void windowClosing(WindowEvent event){
29 System.exit(0);
30 }
31 }
32);
33 }
34 }
Рис 20.6 Рисование с помощью указателя мыши
В строках с 9-15 определяется анонимный внутренний класс, расширяющий класс MouseMotionAdapter (который реализует интерфейс MouseMotionListener). Анонимный внутренний класс наследует стандартную реализацию обоих метеодов mouseMoved и mouseDragged. Таким образом, анонимный класс уже удовлетворяет требованию, чтобы в интерфейсе были определены все методы. В строках 10-14 метод mouseDragged переопределяется, и в нем определяются х- и у- координаты события перетаскивания мыши и запоминаются в переменных xValue и yValue. Затем вызывается метод repaint() для инициализации вывода изовражения следующего овала на фоне окна (выполняется методом paint() в строках 20-23). В строке 26 регистрируется слушатель WindowListener для обработки событий окна приложения(событие закрытия окна). Определение анонимного внутреннего класса, расширяющего класс WindowAdapter (реализующего интерфейс WindowListener) – в строке 27. Анонимный класс наследует базовую реализацию семи различных методов-обработчиков событий окна. А мы переопределяем только метод windowClosing (строки 28-30)для завершения приложения при нажатии на кнопку закрытия окна программы.
Дата добавления: 2015-10-29; просмотров: 111 | Нарушение авторских прав
<== предыдущая страница | | | следующая страница ==> |
Обработка событий мыши | | | Использование потоков в анимации |