Red World

Глава 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.




Сайт создан в системе uCoz