Читаем Java 7 полностью

Если вам понадобится обработать просто действие мыши, не важно, нажатие это, перемещение или еще что-нибудь, то придется включать эту обработку во все семь методов двух классов-слушателей событий мыши.

Задачу можно облегчить, выполнив обработку не в слушателе, а на более ранней стадии. Дело в том, что прежде чем событие дойдет до слушателя, оно обрабатывается несколькими методами.

Чтобы в компоненте произошло событие AWT, должно быть выполнено хотя бы одно из двух условий: к компоненту присоединен слушатель или в конструкторе компонента определена возможность появления события методом enableEvents (). В аргументе этого метода через операцию побитового сложения перечисляются константы класса AWTEvent, задающие события, которые могут произойти в компоненте, например:

enableEvents (AWTEvent.MOUSE_MOTION_EVENT_MASK |

AWTEvent.MOUSE_EVENT_MASK | AWTEvent. KEY_EVENT_MASK)

При появлении события создается объект соответствующего класса XxxEvent. Метод dispatchEvent () определяет, где появилось событие — в компоненте или одном из его

подкомпонентов,- и передает объект-событие методу processEvent () компонента-

источника.

Метод processEvent () определяет тип события и передает его специализированному методу processXxxEvent (). Вот начало этого метода:

protected void processEvent(AWTEvent e){ if (e instanceof FocusEvent){

processFocusEvent((FocusEvent)e);

}else if (e instanceof MouseEvent){ switch(e.getID()){

case MouseEvent.MOUSE_PRESSED: case MouseEvent.MOUSE RELEASED: case MouseEvent.MOUSE_CLICKED: case MouseEvent.MOUSE ENTERED: case MouseEvent.MOUSE EXITED:

processMouseEvent((MouseEvent)e); break;

case MouseEvent.MOUSE MOVED: case MouseEvent.MOUSE_DRAGGED:

processMouseMotionEvent((MouseEvent)e); break;

}

}else if (e instanceof KeyEvent){ processKeyEvent((KeyEvent)e);

}

// ...

Затем в дело вступает специализированный метод, например processKeyEvent(). Он-то и передает объект-событие слушателю. Вот исходный текст этого метода:

protected void processKeyEvent(KeyEvent e){

KeyListener listener = keyListener; if (listener != null){ int id = e.getID(); switch(id){

case KeyEvent.KEY TYPED: listener.keyTyped(e); break;

case KeyEvent.KEY PRESSED: listener.keyPressed(e); break;

case KeyEvent.KEY RELEASED: listener.keyReleased(e); break;

}

}

}

Из этого описания видно, что если вы хотите обработать любое событие типа AWTEvent, то вам надо переопределить метод processEvent(), а если более конкретное событие, например событие клавиатуры, — переопределить более конкретный метод processKeyEvent (). Если вы не переопределяете весь метод целиком, то не забудьте в конце обратиться к методу суперкласса, например:

super.processKeyEvent(e);

Замечание

Не забывайте обращаться к методу processXxxEvent () суперкласса.

В главе 10 мы уже применили такое переопределение в листинге 10.10 для вызова всплывающего меню.

Создание собственного события

Вы можете создать собственное событие и определить источник и условия его возникновения.В листинге 15.7 приведен пример создания события MyEvent, любезно предоставленный Вячеславом Педаком.Событие MyEvent говорит о начале работы программы (start) и окончании ее работы

(stop).

Листинг 15.7. Создание собственного события

// 1. Создаем свой класс события:

public class MyEvent extends java.util.EventObject{ protected int id;

public static final int START = 0, STOP = 1; public MyEvent(Object source, int id){ super(source); this.id = id;

}

public int getID(){ return id; }

}

// 2. Описываем Listener:

public interface MyListener extends java.util.EventListener{ public void start(MyEvent e); public void stop(MyEvent e);

}

// 3. В теле нужного класса создаем метод fireEvent(): protected Vector listeners = new Vector(); public void fireEvent( MyEvent e){

Vector list = (Vector) listeners.clone(); for(int i = 0; i < list.size(); i++){

MyListener listener = (MyListener)list.elementAt(i); switch(e.getID()){

case MyEvent.START: listener.start(e); break; case MyEvent.STOP: listener.stop(e); break;

}

}

}

Все, теперь при запуске программы делаем

fireEvent(this, MyEvent.START);

а при окончании

fireEvent(this, MyEvent.STOP);

При этом все зарегистрированные слушатели получат экземпляры событий.

Вопросы для самопроверки

1. Какая модель обработки событий выбрана в AWT?

2. Что нового добавила в обработку событий библиотека Swing?

3. Какие компоненты отслеживают события мыши?

4. Какие компоненты отслеживают события клавиатуры?

5. Может ли одно и то же событие возникнуть сразу в нескольких компонентах?

6. Может ли одно действие вызвать сразу несколько событий?

7. Можно ли сделать обработку нескольких событий одним методом?

8. Можно ли обработать одно событие сразу несколькими методами?

9. Как в AWT осуществляется диспетчеризация событий?

ГЛАВА 16

<p><strong>Оформление рамок</strong></p>
Перейти на страницу:

Все книги серии В подлиннике

Java 7
Java 7

Рассмотрено все необходимое для разработки, компиляции, отладки и запуска приложений Java. Изложены практические приемы использования как традиционных, так и новейших конструкций объектно-ориентированного языка Java, графической библиотеки классов Swing, расширенной библиотеки Java 2D, работа со звуком, печать, способы русификации программ. Приведено полное описание нововведений Java SE 7: двоичная запись чисел, строковые варианты разветвлений, "ромбовидный оператор", NIO2, новые средства многопоточности и др. Дано подробное изложение последней версии сервлетов, технологии JSP и библиотек тегов JSTL. Около двухсот законченных программ иллюстрируют рассмотренные приемы программирования. Приведена подробная справочная информация о классах и методах Core Java API.

Ильдар Шаукатович Хабибуллин

Программирование, программы, базы данных

Похожие книги

1С: Бухгалтерия 8 с нуля
1С: Бухгалтерия 8 с нуля

Книга содержит полное описание приемов и методов работы с программой 1С:Бухгалтерия 8. Рассматривается автоматизация всех основных участков бухгалтерии: учет наличных и безналичных денежных средств, основных средств и НМА, прихода и расхода товарно-материальных ценностей, зарплаты, производства. Описано, как вводить исходные данные, заполнять справочники и каталоги, работать с первичными документами, проводить их по учету, формировать разнообразные отчеты, выводить данные на печать, настраивать программу и использовать ее сервисные функции. Каждый урок содержит подробное описание рассматриваемой темы с детальным разбором и иллюстрированием всех этапов.Для широкого круга пользователей.

Алексей Анатольевич Гладкий

Программирование, программы, базы данных / Программное обеспечение / Бухучет и аудит / Финансы и бизнес / Книги по IT / Словари и Энциклопедии
1С: Управление торговлей 8.2
1С: Управление торговлей 8.2

Современные торговые предприятия предлагают своим клиентам широчайший ассортимент товаров, который исчисляется тысячами и десятками тысяч наименований. Причем многие позиции могут реализовываться на разных условиях: предоплата, отсрочка платежи, скидка, наценка, объем партии, и т.д. Клиенты зачастую делятся на категории – VIP-клиент, обычный клиент, постоянный клиент, мелкооптовый клиент, и т.д. Товарные позиции могут комплектоваться и разукомплектовываться, многие товары подлежат обязательной сертификации и гигиеническим исследованиям, некондиционные позиции необходимо списывать, на складах периодически должна проводиться инвентаризация, каждая компания должна иметь свою маркетинговую политику и т.д., вообщем – современное торговое предприятие представляет живой организм, находящийся в постоянном движении.Очевидно, что вся эта кипучая деятельность требует автоматизации. Для решения этой задачи существуют специальные программные средства, и в этой книге мы познакомим вам с самым популярным продуктом, предназначенным для автоматизации деятельности торгового предприятия – «1С Управление торговлей», которое реализовано на новейшей технологической платформе версии 1С 8.2.

Алексей Анатольевич Гладкий

Финансы / Программирование, программы, базы данных