- •Лабораторная работа 2
- •Цели работы
- •Порядок выполнения работы
- •Вопросы для самопроверки и защиты.
- •Краткие теоретические сведения
- •Рисование в окне
- •Графика
- •Приложение FontsList
- •Как обрабатываются события в Java 1.1
- •Приложение LinesDraw
- •Int xDown, yDown; // координаты нажатия клавиши
- •Int xPrev, yPrev; // предыдущие координаты конца линии
- •Приложение KeyCodes
- •Графика 2d
Как обрабатываются события в Java 1.1
Модель событий, применяемая в Java 1.1, подходит и для использования в AWT и в Swing. В этой модели различные виды событий представляются различными классами. Каждое событие - это класс, наследуемый от класса java.util.EventObject. Все AWT события наследуются от класса java.awt.AWTEvent. Для удобства различные типы событий AWT, например, MouseEvent или ActionEvent помещены в отдельный пакет java.awt.event.
Каждое событие имеет объект- источник, который можно получить с помощью метода getSource(), каждое событие имеет идентификатор, который может быть получен с помощью метода getID(). Этот идентификатор позволяет отличать события разных видов, но поступающие от одного источника. Например, событие FocusEvent имеет два типа: FocusEvent.FOCUS_GAINED (фокус получен ) и FocusEvent.FOCUS_LOST (фокус потерян ). Классы событий, кроме того, содержат данные и методы, специфичные для данного типа событий. Например, класс MouseEvent имеет методы getX(), getY(), getClickCount(), специфичные для обработки событий от мыши, а также и методы getWhen() и getModifiers(), общие для всех событий.
В Java 1.1 модель событий базируется на концепции "слушаю события". Объект, ожидающий какое-либо событие , "слушает" его , является event listener. Объект, вырабатывающий событие, (источник события) поддерживает список объектов, ожидающих событие, и оповещает все объекты в списке о его появлении. Источник события имеет методы для добавления объектов, ожидающих события, а также методы для удаления таких объектов.
Источник события при возникновении события запускает метод и передает в него объект события типа EventObject или производного от него. Для того, чтобы запустить нужный метод, все объекты, ожидающие события, должны иметь эти методы. Значит, надо, чтобы все объекты типа listener реализовывали определенный интерфейс. Например, объект, ожидающий событие типа ActionEvent, должен реализовать интерфейс ActionListener. Пакет java.awt.event определяет такой интерфейс для каждого события. MouseEvent класс определяет два интерфейса : MouseListener и MouseMotionListener. Все интерфейсы наследуют от интерфейса java.util.EventListener.
Интерфейс может определять несколько методов. Например, класс MouseEvent представляет несколько событий: нажатие кнопки, отпускание кнопки, и другие. Для удобства все методы имеют один аргумент, определяющий тип события. В таблице приводятся тип объекта, интерфейс для его обработки и методы, определяемые в каждом интерфейсе.
Таблица 1. Класс события, интерфейс и методы для обработки.
Event Class |
Listener Interface |
Listener Methods |
ActionEvent |
ActionListener |
actionPerformed() |
AdjustmentEvent |
AdjustmentListener |
adjustmentValueChanged() |
ComponentEvent |
ComponentListener |
componentHidden() |
|
|
componentMoved() |
|
|
componentResized() |
|
|
componentShown() |
ContainerEvent |
ContainerListener |
componentAdded() |
|
|
componentRemoved() |
FocusEvent |
FocusListener |
focusGained() |
|
|
focusLost() |
ItemEvent |
ItemListener |
itemStateChanged() |
KeyEvent |
KeyListener |
keyPressed() |
|
|
keyReleased() |
|
|
keyTyped() |
MouseEvent |
MouseListener |
mouseClicked() |
|
|
mouseEntered() |
|
|
mouseExited() |
|
|
mousePressed() |
|
|
mouseReleased() |
|
MouseMotionListener |
mouseDragged() |
|
|
mouseMoved() |
TextEvent |
TextListener |
textValueChanged() |
WindowEvent |
WindowListener |
windowActivated() |
|
|
windowClosed() |
|
|
windowClosing() |
|
|
windowDeactivated() |
|
|
windowDeiconified() |
|
|
windowIconified() |
|
|
windowOpened() |
Для каждого из интерфейсов, содержащих более одного метода, java.awt.event определяет простой класс- адаптер, который определяет пустые тела методов для каждого из методов интерфейса. Когда Вы хотите использовать один или два метода, нет необходимости реализовывать весь интерфейс. Проще использовать адаптер для того, чтобы изменить тело метода. Такие адаптеры имеют имена, такие же как и имена интерфейсов с заменой Listener на Adapter: MouseAdapter, WindowAdapter.
Если Вы реализовали интерфейс или создали класс адаптера, Вы должны создать объект для того, чтобы он "слушал" событие. Затем Вы должны зарегистрировать этот объект в источнике события. В AWT источник события всегда компонента AWT: кнопка, или список, или окно и т.д. Эта регистрация делается с помощью методов с именами вида addXXXListener. Удаление объекта из списка слушающих выполняется с помощью removeXXXListener. Здесь XXX - имя типа события, генерируемого источником. Например, объект типа Button генерирует событие типа ActionEvent, регистрация выполняется с помощью метода addActionListener.
В таблице 3.2 приведены все компоненты AWT и типы событий, которые они могут генерировать.
Таблица 2. Компоненты AWT и типы событий, которые они могут генерировать.
Компонент |
События, генерируемые компонентом |
Значение |
Button |
ActionEvent |
Пользователь нажал на кнопку |
Checkbox |
ItemEvent |
Пользователь щелкнул на элементе, изменив выбор |
CheckboxMenuItem |
ItemEvent |
Пользователь выбрал пункт из меню |
Choice |
ItemEvent |
Пользователь щелкнул на элементе, изменив выбор |
Component |
ComponentEvent |
Компонент передвинут, изменил размеры, стал видимым или невидимым. |
|
FocusEvent |
Компонент получил или потерял фокус |
|
KeyEvent |
Пользователь нажал или отпустил клавишу |
|
MouseEvent |
Пользователь щелкнул кнопкой мыши, или мышь попала в пределы компонента или ушла за его границы, или пользователь тянет объект. Примечание: MouseEvent имеет два интерфейса прослушивания, MouseListener и MouseMotionListener. |
Container |
ContainerEvent |
Компонент добавлен или удален из контейнера |
List |
ActionEvent |
Пользователь дважды щелкнул на элементе списка |
|
ItemEvent |
Пользователь выбрал пункт из списка |
MenuItem |
ActionEvent |
Пользователь выбрал пункт меню |
Scrollbar |
AdjustmentEvent |
Пользователь передвинул движок |
TextComponent |
TextEvent |
Пользователь изменил текст |
TextField |
ActionEvent |
Пользователь закончил редактирование текста |
Window |
WindowEvent |
Окно открыто, или закрыто. или минимизировано, или максимизировано |
Пример обработки события с использованием реализации интерфейса.
import java.awt.event.MouseListener;
import java.awt.event.MouseEvent;
import java.applet.Applet;
import java.awt.Graphics;
public class SimpleClick extends Applet
implements MouseListener {
StringBuffer buffer;
public void init() {
addMouseListener(this);
buffer = new StringBuffer();
addItem("initializing... ");
}
public void start() {
addItem("starting... ");
}
public void stop() {
addItem("stopping... ");
}
public void destroy() {
addItem("preparing for unloading...");
}
void addItem(String newWord) {
System.out.println(newWord);
buffer.append(newWord);
repaint();
}
public void paint(Graphics g) {
g.drawRect(0, 0, getSize().width - 1, getSize().height - 1);
g.drawString(buffer.toString(), 5, 15);
}
// Следующие методы можно удалить при использовании класса адаптера
public void mouseEntered(MouseEvent event) {
}
public void mouseExited(MouseEvent event) {
}
public void mousePressed(MouseEvent event) {
}
public void mouseReleased(MouseEvent event) {
}
public void mouseClicked(MouseEvent event) {
addItem("click!... ");
}
}
Пример обработки события с использованием вложенного класса.
import java.applet.*;
import java.awt.*;
import java.awt.event.*;
public class Scribble2 extends Applet {
int last_x, last_y;
public void init() {
// Define, instantiate, and register a MouseListener object.
this.addMouseListener(new MyMouseAdapter());
// Define, instantiate, and register a MouseMotionListener object.
this.addMouseMotionListener(new MyMouseMotionAdapter());
// Create a clear button.
Button b = new Button("Clear");
// Define, instantiate, and register a listener to handle button presses.
b.addActionListener(new MyActionEventListener());
// And add the button to the applet.
this.add(b);
}
class MyMouseAdapter extends MouseAdapter {
public void mousePressed(MouseEvent e) {
last_x = e.getX();
last_y = e.getY();
}
}
class MyMouseMotionAdapter extends 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;
}
}
class MyActionEventListener implements ActionListener {
public void actionPerformed(ActionEvent e) {
Graphics g = getGraphics();
g.setColor(getBackground());
g.fillRect(0, 0, getSize().width, getSize().height);
}
}
}
Пример обработки события с использованием вложенного анонимного класса.
import java.applet.*;
import java.awt.*;
import java.awt.event.*;
public class Scribble3 extends Applet {
int last_x, last_y;
public void init() {
// Define, instantiate, and register a MouseListener object.
this.addMouseListener(new MouseAdapter() {
public void mousePressed(MouseEvent e) {
last_x = e.getX();
last_y = e.getY();
}
});
// Define, instantiate, and register a MouseMotionListener object.
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;
}
});
// Create a clear button.
Button b = new Button("Clear");
// Define, instantiate, and register a listener to handle button presses.
b.addActionListener(new ActionListener() {
public void actionPerformed(ActionEvent e) { // clear the scribble
Graphics g = getGraphics();
g.setColor(getBackground());
g.fillRect(0, 0, getSize().width, getSize().height);
}
});
// And add the button to the applet.
this.add(b);
}
}