Программирование на JAVA
Меню :
Стартовая
Основы программирования
Программирование на JAVA
Программирование на C++
Программирование на Pascal
Задачи по программированию
Предположим, в приложение добавляется кнопка, которой следует добавить слушателя. Зачастую бывает удобно описать логику действий в отдельном методе того же класса. Если вводить слушателя, как делалось раньше - в отдельном классе, то это сразу порождает ряд неудобств: появляется новый, малосодержательный класс, которому к тому же необходимо передать ссылку на исходный класс и так далее.
Гораздо удобнее поступить следующим образом:
Button b = new Button(); b.addActionl_istener(new ActionListener() { public void actionPerformed(ActionEvent e) { processButtonQ;
}
};
Рассмотрим подробно, что происходит в этом примере. Сначала создается кнопка, у которой затем вызывается метод addActionListener. Обратим внимание на аргумент этого метода. Может сложится впечатление, что производится попытка создать экземпляр интерфейса (new ActionListener()), однако это невозможно. Дело меняет фигурная скобка, которая указывает, что порождается экземпляр нового класса, объявление которого последует за этой скобкой. Класс наследуется от Object и реализует интерфейс ActionListener. Ему необходимо реализовать метод actionPeroformed, что и делается. Обратите внимание на еще одну важную деталь — в этом методе вызывается processButton. Это метод, который мы планировали разместить во внешнем классе. Таким образом, внутренний класс может напрямую обращаться к методам внешнего класса.
Такой класс называется анонимным, он не имеет своего имени. Однако правило, согласно которому компилятор всегда создает .class-файл для каждого класса Java, действует и здесь. Если внешний класс называется Test, то после компиляции появится файл Test$1 .class.
Пример приложения, использующего модель событий
В заключение темы, посвященной событиям, рассмотрим пример приложения, которое активно их использует.
Попробуем написать примитивный графический редактор, который позволяет рисовать с помощью курсора - если перемещать его с нажато" кнопкой мыши, то будет появляться линия. Нажатие пробела очищает поле-import java.awt.*; import java.awt.event.*;
public class DrawCanvas extends Canvas { private int lastX, lastY; private int ex, ey; private boolean clear=false;
public DrawCanvas () { super();
addMousel_istener(new MouseAdapterQ { public void mousePressed(MouseEvent e) { lastX = e.getX(); lastY=e.getY();