Программирование на языке Java

       

Модели обработки событий


Глава 17 Модели обработки событий

Несмотря на существенные изменения механизма обработки событий в AWT, Java1.1 поддерживает обратную совместимость с моделью обработки событий, принятой в Java 1.0. Однако такая совместимость относится к типу “все или ничего” – эти две модели настолько отличаются друг от друга, что их невозможно использовать в одном приложении одновременно.

Модель обработки событий Java 1.0

Все компоненты, которые мы с вами до сих пор создавали, выглядели неплохо, но были абсолютно бесполезны, поскольку мы не говорили о том, как можно обрабатывать ввод пользователя, осуществляемый с помощью этих управляющих элементов пользовательского интерфейса.

Каждый компонент может обрабатывать события, заместив определенные методы, вызываемые используемой по умолчанию реализацией метода handleEvents класса Component. Этот метод вызывается с объектом класса Event, описывающего все возможные типы событий. Наиболее часто используемые события, например, те, что связаны с мышью и клавиатурой, диспетчеризируются другим методам класса Component.

Все события, связанные с мышью, вызываются с копией оригинального события, а также с координатами х и у, в которых это событие произошло.

  • mouseEnter вызывается в том случае, когда мышь входит в компонент.
  • mouseExit вызывается при выходе мыши из области компонента.
  • mouseMove вызывается при перемещении мыши в области компонента.


  • mouseDown вызывается при нажатии кнопки мыши.
  • mouseDrag вызывается при перемещении мыши с нажатой кнопкой.
  • mouseUp вызывается при отпускании кнопки мыши.
  • Аналогично, keyDown и keyUp вызываются при каждом нажатии и отпускании клавиши. Событие передается методу вместе с кодом нажатой клавиши. Событие можно проверить, чтобы посмотреть, нажаты ли в данный момент какие либо клавиши-модификаторы, для этой цели можно также пользоваться методами shiftDown, controlDown и metaDown. В классе Event определены десятки констант, позволяющих использовать символические имена, например, PGUP и HOME.

    Наконец, для работы со специальными событиями, например, с обратными вызовами (callback) из компонентов Button, Scrollbar и Menu, вам придется замещать метод action. Этот метод вызывается с исходным событием и со вторым параметром, который представляет собой компонент пользовательского интерфейса, создавший это событие. Вы должны проверить этот объект, разобраться, какой из компонентов послал вам событие, после чего передать управление соответствующему данному компоненту обработчику. Для того, чтобы перед приведением типа проверить, принадлежит ли объект к определенному классу, например, к классу Button, вы можете использовать оператор instanceof.


    А вот и пример на обработку событий. Мы добавили объект Label к примеру с игрой в “пятнашки”, а также заместили метод action для того, чтобы обрабатывать события, возникающие при нажатии кнопок. Точно такой же механизм можно использовать для управления вводом через любой из подклассов Component.



    /* <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 перечислены типы событий, которые он может порождать. В первом столбце таблицы указан тип элемента, а во втором — тип соответствующего ему события. Тип события представляет собой константу, которая записывается в переменную id объекта класса Event.

    В столбцах с третьего по седьмой указано, устанавливаются ли значения переменных -when (время события), х (координата х курсора мыши), у (координата у курсора мыши), key (нажатая кнопка) и modifiers (специальные клавиши, которые нажаты при этом) для данного события. Если в столбце стоит точка, значит, событие устанавливает значение соответствующей переменной. В восьмом столбце объяснено, что порождает данное событие и приведено значение, которое записывается в переменной arg объекта класса Event.



    События, перечисленные для элементов класса Component, применимы ко всем подклассам класса java.awt. Component, а события, приведенные для элементов класса window, относятся как к подклассам класса window, так и к классам Dialog и Frame.

    Таблица 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 * * Окно перемещено не используется

    Содержание раздела