Сегодня мы научимся отвечать на события от компонентов. Я думаю, что это будет последнее занятие, на котором мы работаем с чистым Java. В следующей статье мы перейдём в среду разработки JBuilder от фирмы Borland. Да, именно Borland. Inprise снова вернулась к своему старому названию. А самое главное для нас – бесплатная и полноценная версия JBuilder от этой фирмы.
А сейчас я всё же вернусь к нашим кабанчикам. Все примеры, которые я писал были абсолютно бесполезны. Зачем нужна кнопка, если мы не можем поймать её событие? Просто чтобы понажимать? Я думаю нет. Если ты давишь на пимпу, то что-то должно происходить, иначе всё это полный бардак.
Существует две модели обработки событий. Первая была принята в Java 1.0, а вторая в Java 1.1. Они отличаются друг от друга, как муха от слона. Мы с тобой будем изучать более новую модель из Java 1.1. Тебе нужно только помнить: всё что я говорю, может не работать в версии 1.0. В принципе, тебя это не должно сильно волновать, потому что 1.0 устарела уже давно и нигде не сохранилась. Несмотря на это, старую модель можно использовать в Java 1.1 и некоторые так и делают. Но я считаю, что это извращение, потому что использовать обе модели сразу в одном проекте нельзя. А отказываться от новых возможностей ради старых древесин я не собираюсь.
Анекдот:
Сообщение в амеpиканской пpессе:
"Вчеpа веpховным судом США был осужден на десять лет известный хакеp Destroer за незаконное втоpжение в финансовые компьютеpные сети. Отбывать заключение осужденный напpавлен в тюpьму штата Аляска. Банковские воpотилы могут спать спокойно."
Сообщение в амеpиканской пpессе на следующий день:
"Согласно данным главного компьютеpа сети испpавительных учpеждений штата Аляска бывший хакеp Destroer полностью отбыл 10-летний сpок заключения и тепеpь с чистой совестью выходит на свободу"
Обработка событий в Java 1.1 – это обработка событий. При создании компонента, ты говоришь ему, какую функцию надо вызывать при определённом событии. Чтобы добиться этого, нужно создать отдельный класс, который и будет реализовывать ответ. А компоненту можно передать экземпляр этого класса.
Кстати, тебе неверно непонятно, что такое экземпляр класса? Когда ты инициализируешь класс (объект), то ты присваиваешь переменной класс (объект). После этого переменная становится указателем на новый класс, а точнее сказать одним из его экземпляров. Новая модель событий работает в библиотеках AWT и JavaBeans API.
Для каждого типа событий есть свои классы. Каждое событие является подклассом класса java.util.EventObject. Для каждого события существует порождающий его объект, который можно получить с помощью метода getSource(), и каждому событию пакета AWT соответствует определенный идентификатор, который позволяет получить метод getid().Полученное значение используется для того, чтобы отличать события различных типов, которые могут описываться одним и тем же классом.
Обработка по событию происходит с помощью «слушателей». «Слушателем» является объект, который ожидает появления определённого события. Когда источник порождает событие ), он оповещает все объекты «слушателей» о том, что данное событие произошло. В таблицу 1 я засандолил определенные в пакете java.awt.event типы событий, соответствующие им слушатели, а также методы, определенные в каждом интерфейсе слушателя
Таблица 1. Типы событий, слушатели и методы слушателей
В таблице 2 я привел список элементов пакета AWT и событий, которые они порождают:
Элемент
Порождаемое событие
Значение
Button
ActionEvent
Пользователь нажал кнопку
CheckBox
ItemEvent
Пользователь установил или сбросил флажок
CheckBoxMenuItem
ItemEvent
Пользователь установил или сбросил флажок рядом с пунктом меню
Choice
ItemEvent
Пользователь выбрал элемент списка или отменил его выбор
Component
ComponentEvent
Элемент либо перемещен, либо он стал скрытым,либо видимым
FocusEvent
Элемент получил или потерял фокус ввода
KeyEvent
Пользователь нажал
или отпустил клавишу
MouseEvent
Пользователь нажал
или отпустил кнопку мыши, либо курсор мыши вошел или покинул область, занимаемую элементом, либо пользователь просто переместил мышь или переместил мышь при нажатой кнопке мыши
Container
ContainerEvent
Элемент добавлен в контейнер или удален из него
List
ActionEvent
Пользователь выполнил двойной щелчок мыши на элементе списка
ItemEvent
Пользователь выбрал элемент списка или отменил выбор
MenuItem
ActionEvent
Пользователь выбрал
пункт меню
Scrollbar
AdjustmentEvent
Пользователь
осуществил прокрутку
TextComponent
TextEvent
Пользователь
внес изменения в текст элемента
TextField
ActionEvent
Пользователь
закончил редактирование текста элемента
Window
WindowEvent
Окно было открыто, закрыто, представлено в виде пиктограммы, восстановлено или требует восстановления
Ну а теперь сам пример, который мы сегодня разберём:
import java.applet.*;
import java.awt.*;
import java.awt.event.*;
public class myliner extends Applet {
int last_x, last_y;
public void init() {
// Здесь мы создаём и регистрируем MouseListener.
this.addMouseListener(new MouseAdapter() {
public void mousePressed(MouseEvent e) {
last_x = e.getX(); last_y = e.getY();
}
});
// Создам и регистрируем MouseMotionListener.
this.addMouseMotionListener(new MouseMotionAdapter() {
public void mouseDragged(MouseEvent e) {
Graphics g = getGraphics();
int x = e.getX(), y= e.getY();
g.setColor(Color.black);
g.drawLine(last_x, last_y, x, y);
last_x = x; last_y = y;
}
});
// Создаём кнопку Clear.
Button b = new Button("Очистить");
// Создаём слушателя на нажатие кнопки
b.addActionListener(new ActionListener() {
public void actionPerformed(ActionEvent e) {
// Очищаем рисунок
Graphics g = getGraphics();
g.setColor(getBackground());
g.fillRect(0, 0, getSize().width, getSize().height);
}
});
this.add(b);
} }
После компиляции у тебя получится 4-е выходных файла, и все они нужны: