Глава 17 Модели обработки событий
Несмотря на существенные изменения механизма обработки событий в AWT, Java1.1 поддерживает обратную совместимость с моделью об
Модель обработки событий Java 1.0
Все компоненты, которые мы с вами до сих пор создавали, выглядели неплохо, но были абсолютно бесполезны, поскольку мы не говорили о том, как можно обрабатывать ввод пользователя, осуществляемый с
Каждый компонент может обрабатывать события, заместив определенные методы, вызываемые используемой по умолчанию реализацией метода handleEvents класса Component. Этот метод вызывается с объекто
Все события, связанные с мышью, вызываются с копией оригинального события, а также с координатами х и у, в которых это событие произошло.
Аналогично, keyDown и keyUp вызываются при каждом нажатии и отпускании клавиши. Событие передается методу вместе с кодом нажатой клавиши. Событие можно проверить, чтобы посмотреть, нажаты ли в
Наконец, для работы со специальными событиями, например, с обратными вызовами (callback) из компонентов Button, Scrollbar и Menu, вам придется замещать метод action. Этот метод вызывается с исх
А вот и пример на обработку событий. Мы добавили объект Label к примеру с игрой в “пятнашки”, а также заместили метод action для того, чтобы обрабатывать события, возникающие при нажатии кнопок
/* <applet code = “EventDemo” width=200 height=200>
</applet>
*/
import java.awt.*;
import java.applet.*;
public class EventDemo extends Applet {
static final int n = 4;
Label lab = new Label("?", Label.CENTER);
public void init() {
setLayout(new GridLayout(n, n));
setFont(new Font("Helvetica", Font.BOLD, 24));
int width = Integer.parseInt(getParameter("width"));
int height = Integer.parseInt(getParameter("height"));
for (int i = 0; i < n; i++) {
for (int j = 0; j < n; j++) {
int k = i * n + j;
if (k > 0)
add(new Button("" + k));
}
}
lab.setFont(new Font("Helvetica", Font.ITALIC, 24));
add(lab);
}
public boolean action(Event e, Object o) {
if (o instanceof String) {
lab.setText((String) o);
}
return false;
} }
Поиграйте с этим примером – EventDemo.html.
Элементы и связанные с ними события
В таблице 5 для каждого элемента пакета AWT перечислены типы со
В столбцах с третьего по седьмой указано, устанавливаются ли значения переменных -when (время события), х (координат
События, перечисленные для элементов класса Component, применимы ко всем подклассам класса java.awt. Component
Таблица 5. Элементы AWT и события Java 1.0,
Элемент
Тип события (id)
w
h
e
n
x
y
k
e y
m о
d
s
Смысл события
Тип и значение переменной arg
Button (кнопка)
ACTION_EVENT
Пользователь нажал кнопку
String: обозначение кнопки
Checkbox (флажок)
ACTION_EVENT
Пользователь активизировал флажок
Boolean: новое состояние флажка
Choice (список выбора)
ACTION_EVENT
Пользователь выбрал элемент списка
String: обозначение выбранного элемента
Element (элемент)
GOT_FOCUS
Получение фокуса ввода
не используется
Element (элемент)
KEY_ACTION
*
*
*
*
*
Пользователь нажал функциональную клавишу
не используется, поскольку key содержит константу клавиши
Element (элемент)
KEY_ACTION_ RELEASE
*
*
*
*
*
Пользователь отпустил функциональную клавишу
не используется, поскольку key содержит константу клавиши
Element (элемент)
KEY_PRESS
*
*
*
*
*
Пользователь нажал клавишу
не используется, поскольку key содержит ASCII-код клавиши
Element (элемент)
KEY_RELEASE
*
*
*
*
*
Пользователь отпустил клавишу
не используется, поскольку key содержит ASCII-код клавиши
Element (элемент)
LOST_FOCUS
Потеря фокуса ввода
не используется
Element (элемент)
MOUSE_ENTER
*
*
*
Курсор мыши попал в область объекта класса
Component
не используется
Element (элемент)
MOUSE_EXIT
*
*
*
Курсор мыши вышел из области объекта класса Component
не используется
Element (элемент)
MOUSE_D0WN
*
*
*
*
Пользователь нажал кнопку мыши
не используется
Element
(элемент)
MOUSE_UP
*
*
*
*
Пользователь отпустил кнопку мыши
не используется
Element (элемент)
MOUSE_MOVE
*
*
*
*
Пользователь переместил мышь
не используется
Element (элемент)
MOUSE_DRAG
*
*
*
*
Пользователь переместил мышь при нажатой кнопке мыши
не используется
List (список)
ACTION_EVENT
Пользователь выполнил двойной щелчок мыши на элементе списка
String: обозначение выбранного элемента
List (список)
LIST_SELECT
Пользователь выбрал элемент списка
Integer: индекс выбранного элемента
List (список)
LIST_DESELECT
Пользователь убрал выделение с определенного элемента
Integer: индекс элемента
Menu Item (меню)
ACTION_EVENT
Пользователь выбрал пункт меню
String: обозначение выбранного пункта
Scrollbar (полоса прокрутки)
SCROLL_LINE_UP
Пользователь осуществил прокрутку вверх на строку
Integer: позиция, до которой осуществляется прокрутка
Scrollbar (полоса прокрутки)
SCROLL_LINE_
DOWN
Пользователь осуществил прокрутку вниз на строку
Integer: позиция, до которой осуществляется прокрутка
Scrollbar (полоса прокрутки)
SCROLL_PAGE_UP
Пользователь осуществил прокрутку вверх на страницу
Integer: позиция, до которой осуществляется прокрутка
Scrollbar (полоса прокрутки)
SCROLL_PAGE_
DOWN
Пользователь осуществил прокрутку вниз на страницу
Integer: позиция, до которой осуществляется прокрутка
Scrollbar (полоса прокрутки)
SCROLL_
ABSOLUTE
Пользователь переместил ползунок полосы прокрутки
Integer: позиция, до которой осуществляется прокрутка
Text Field (текст)
ACTION_EVENT
Пользователь ввел текст и нажал [Return].
String: введенный текст
Window (окно)
WINDOW_
DESTROY
Окно закрыто
не используется
Window (окно)
WINDOW_
ICONIFY
Окно представлено в виде пиктограммы
не используется
Window (окно)
WINDOW_
DEICONIFY
Окно восстановлено
не используется
Window (окно)
WINDOW_MOVED
*
*
Окно перемещено
не используется
Рисование "каракулей" в Java 1.0
Классический апплет, в котором используется модель обработки событий Java 1.0. В нем методы mouseDown()
/* <applet code = “Scribble1” width=200 height=200>
</applet>
*/
import java.applet.*;
import java.awt.*;
/** Простой апплет, в котором используется модель обработки событий 1.0 */
public class Scribble1 extends Applet {
private int lastx, lasty; // Хранят координаты курсора мыши.
Button clear_button; // Кнопка Clear.
Graphics g; // Объект Graphics, который необходимо нарисовать.
/** Инициализация кнопки и объекта Graphics */
public void init() {
clear_button = new Button("Clear");
this.add(clear_button);
g = this.getGraphics();
}
/** Реакция на нажатие кнопки мыши */
public boolean mouseDown(Event e, int x, int y) {
lastx = x; lasty = y;
return true;
}
/** Реакция на перетаскивание с помощью мыши */
public boolean mouseDrag(Event e, int x, int y) {
g.setColor(Color.black) ;
g.drawLine(lastx, lasty, x, y);
lastx = x; lasty = y;
return true;
}
/** Реакция на нажатие клавиши [С] */
public boolean keyDown(Event e, int key) {
if ((e.id == Event.KEY_PRESS) && (key == 'с' ) ) {
clear() ;
return true;
}
else return false;
}
/** Реакция на нажатие кнопки Clear */
public boolean action(Event e, Object arg) {
if (e.target == clear_button) {
clear();
return true;
}
else return false;
}
/** Метод для стирания каракулей */
public void clear() {
g.setColor(this.getBackground());
g.fillRect(0, 0, bounds().width, bounds().height);
} }
Экран вроде бы пустой – но на нем можно рисовать ! – Scribble1.html.
Модель обработки событий Java 1.1
Новая модель обработки событий представляет собой, по существу, модель обратных вызовов (callback). При создании
Модель обработки событий Java 1.1 используется как в пакете AWT, так и в JavaBeans API.
Для каждого события существует порождающий его объект, который можно получить с помощью метода getSource(), и каждому событию паке
Модель обработки событий Java 1.1 базируется на концепции слушателя событий. Слушателем события является объект, заинтересо
Источник события оповещает объект слушателя путем вызова специального метода и передачи ему объекта события (экземпляра подкласса EventObject). Для того чтобы источник мог в
В интерфейсе слушателя событий может определяться несколько методов. Например, класс событий, подобный MouseEvent, описывает несколько событий, связанных с мышью, таких как
Таблица 6. Типы событий, слушатели и методы слушателей в Java 1.1
Класс события |
Интерфейс слушателя |
Методы слушателя |
ActionEvent |
ActionListener |
actionPerformed() |
AdjustmentEvent |
AdjustmentListener |
adjustmentValueChanged() |
ComponentEvent |
ComponentListener |
componentHidden() componentMoved() componentResized() Cor”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() windowlconified() windowOpened() |
Для каждого интерфейса слушателей событий, содержащего несколько методов, в пакете java.awt.event определен простой класс-адаптер,
Как только реализован интерфейс слушателя или получены подклассы класса-адаптера, необходимо создать экземпляр нового класса, чтобы определить конкретный объект слушателя событий. Затем этот сл
Таблица 7. Элементы пакета AWT и порождаемые ими события в Java1.1
Элемент |
Порождаемое событие |
Значение |
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 |
Окно было открыто, закрыто, представлено в виде пиктограммы, восстановлено или требует восстановления |
Рисование "каракулей" в Java 1.1
Модель обработки событий Java 1.1 является достаточно гибкой и предоставляет пользователю ряд возможностей для структуризации
/* <applet code = “Scribble2” width=200 height=200>
</applet>
*/
import java.applet.*;
import java.awt.*;
import java.awt.event.*;
public class Scribble2 extends Applet implements
MouseListener, MouseMotionListener {
private int last_x, last_y;
public void init() {
// Сообщает данному апплету о том, какие объекты
// классов MouseListener и MouseMotionListener он должен оповещать
// о событиях, связанных с мышью и ее перемещением.
// Поскольку интерфейс реализуется в самом апплете,
// при этом будут вызываться методы апплета.
this.addMouseListener(this) ;
this.addMouseMotionListener(this);
}
// Метод интерфейса MouseListener. Вызывается при нажатии
// пользователем кнопки мыши.
public void mousePressed(MouseEvent e) {
last_x = e.getX();
last_y = e.getY();
}
// Метод интерфейса MouseMotionListener. Вызывается при
// перемещении мыши с нажатой кнопкой.
public void mouseDragged(MouseEvent e) {
Graphics g = this.getGraphics();
int x = e.getX(), y = e.getY();
g.drawLine(last_x, last_y, x, y);
last_x = x; last_y = y;
}
// Другие, не используемые методы интерфейса MouseListener.
public void mouseReleased(MouseEvent e) {;}
public void mouseClicked(MouseEvent e) {;}
public void mouseEntered(MouseEvent e) {;}
public void mouseExited(MouseEvent e) {;}
// Другой метод интерфейса MouseMotionListener.
public void mouseMoved(MouseEvent e) {;}
}
Рисуйте на здоровье (может у Вас талант) – Scribble2.html.
Рисование "каракулей" с использованием встроенных классов
Модель обработки событий Java 1.1 разработана с учетом того, чтобы хорошо сочетаться с другой новой особенностью
/* <applet code = “Scribble3” width=200 height=200>
</applet>
*/
import java.applet.*;
import java.awt.*;
import java.awt.event.*;
public class Scribble3 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("Clear");
// Определяет, создает и регистрирует объект слушателя
// для обработки события, связанного с нажатием кнопки.
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);
} }
Еще не нарисовались (может появились новые идеи) – Scribble3.html.