КАТЕГОРИИ:
АстрономияБиологияГеографияДругие языкиДругоеИнформатикаИсторияКультураЛитератураЛогикаМатематикаМедицинаМеханикаОбразованиеОхрана трудаПедагогикаПолитикаПравоПсихологияРиторикаСоциологияСпортСтроительствоТехнологияФизикаФилософияФинансыХимияЧерчениеЭкологияЭкономикаЭлектроника
|
События и их обработкаСовременный подход к обработке событий в Java основан на модели делегирования событий. В этой модели имеется блок прослушивания события (Listener), который ждет поступления события от источника, после чего обрабатывает его и возвращает управление. Источник – это объект, который генерирует событие, если изменяется его внутреннее состояние. Блоки прослушивания представляют собой объекты классов, которые создаются путём реализации интерфейсов прослушивания событий, определённых пакетом java.awt.event. Соответствующие методы объявленные в используемых интерфейсах, необходимо явно реализовать при создании собственных классов прослушивания. Когда событие происходит, все зарегистрированные блоки прослушивания уведомляются и принимают копию объекта события. Источник вызывает метод объекта, являющегося блоком прослушивания и передает объект события в качестве параметра. В таблице приведены некоторые интерфейсы и вызываемые методы, реализуемые в блоках прослушивания событий: Таблица 1 – Типы событий и их методы
Событие – это объект класса событий, который описывает состояние источника. В корне иерархии классов событий находится суперкласс EventObjectиз пакетаjava.util. Этот класс содержит два метода:getSource(), возвращающий источник событий, и toString(), возвращающий строчный эквивалент события. Подкласс AWTEventиз пакета java.awtявляется суперклассом всех AWT-событий. МетодgetID()определяет тип события, возникающего вследствие действий пользователя в визуальном приложении, а именно: ActionEvent- генерируется при нажатии кнопки, двойном щелчке клавишей мыши по элементам списка, при выборе пункта меню; AdjustmentEvent – генерируется при изменении полосы прокрутки; ComponentEvent - генерируется, если компонент скрыт, перемещен, изменен в размере или становится видимым; FocusEvent - генерируется, если компонент получает или теряет фокус ввода и т.д. Класс InputEventявляется абстрактным суперклассом событий ввода (клавиатуры или мыши). Чтобы рассмотреть события, связанные с обработкой событий клавиатуры, необходимо реализовать интерфейс KeyListener,т.е. определить три метода, объявленные в этом интерфейсе. При нажатии клавиши генерируется событие со значением KEY_PRESSED. Это приводит к запросу обработчика событий keyPressed(). Когда клавиша отпускается, генерируется событие со значением KEY_RELEASED и выполняется обработчикkeyReleased(). Если нажатием клавиши сгенерирован символ, то посылается уведомление о событии со значением KEY_TYPEDи вызывается обработчик keyTyped(). Для регистрации события приложение-источник должно вызвать метод, регистрирующий блок прослушивания этого события. Форма метода: public void addТипListener(ТипListener el) Здесь el – ссылка на блок прослушивания события, объект, получающий уведомление о событии. Здесь Тип – имя события, например: addKeyListener()–прослушивание событий клавиатуры. /* пример # 1 : обработка событий клавиатуры : MyKey.java */ import java.awt.*; import java.awt.event.*; import java.applet.*; public class MyKey extends Applet implements KeyListener { String msg = " "; int x = 0, y = 20; //координаты вывода public void init() { addKeyListener(this); /*регистрация данного класса в качестве блока прослушивания */ requestFocus(); //запрос фокуса ввода } //реализация всех трех методов интерфейса KeyListener public void keyPressed(KeyEvent e) { showStatus("Key Down"); } //отображение в строке состояния public void keyReleased(KeyEvent e) { showStatus("Key Up"); } //отображение в строке состояния public void keyTyped(KeyEvent e) { msg += e.getKeyChar(); repaint();//перерисовать } public void paint(Graphics g) { g.drawString(msg, x, y); } //значение клавиши в позиции вывода } Коды специальных клавиш (перемещение курсора, функциональных клавиш) недоступны через keyTyped(), для обработки нажатия этих клавиш используется методkeyPressed(). Для того чтобы не реализовывать все методы из соответствующих интерфейсов при создании классов – блоков прослушивания событий, используются классы – адаптеры. Эти классысодержат пустую реализацию всех методов из интерфейсов прослушивания событий, которые они расширяют. При этом определяется новый класс, действующий как блок прослушивания событий, который расширяет один из имеющихся адаптеров и реализует только те события, которые требуется обрабатывать. Например, класс MouseMotionAdapterимеет два метода:mouseDragged()иmouseMoved(). Сигнатуры этих пустых методов точно такие же, как в интерфейсе MouseMotionListener. Если существует заинтересованность только в событиях перетаскивания мыши, то можно просто расширить адаптер MouseMotionAdapter и переопределить метод mouseDragged()в своем классе. Событие же перемещения мыши обрабатывала бы реализация метода mouseMoved(),которую можно оставить пустой. В ранних (1.0.x) версиях Java использовались “тяжелые” компоненты AWT, связанные с аппаратными платформами и имеющие ограниченные возможности. Дальнейшее развертывание концепции “write once, run everywhere” (“написать однажды, запускать везде”) привело к тому, что в версии 1.1.x наметился переход к таким компонентам, которые бы не были завязаны на конкретные “железо” и операционные системы. Такого рода классы компонентов, написанные на Java, были объединены в библиотеку под названием Swing. Эти классы доступны разработчикам в составе как JDK, так и отдельного продукта JFC (Java Foundation Classes). Причем для совместимости со старыми версиями JDK старые компоненты из AWT остались нетронутыми, хотя компания JavaSoft, отвечающая за выпуск JDK, рекомендует не смешивать в одной и той же программе старые и новые компоненты. Кроме пакета Swing указанные библиотеки содержат большое число компонентов JavaBeans, которые могут использоваться как для ручной, так и для визуальной разработки пользовательских интерфейсов. Перед использованием управляющих компонентов (например кнопок) их надо расположить на форме в нужном порядке. Java для этого использует менеджеры размещения. Они определяют способ, который панель использует, для задания порядка размещения управляющего элемента на форме. Менеджеры размещения контролируют, как выполняется позиционирование компонентов, добавляемых в окна, а также их упорядочение. Если пользователь изменяет размер окна, менеджер размещения переупорядочивает компоненты в новой области так, чтобы они оставались видимыми и в то же время сохранили свои позиции относительно друг друга. Менеджер размещения представляет собой интерфейс LayoutManager, реализованный в виде классов, например: FlowLayout, BorderLayout, GridLayout, CardLayout, BoxLayout и т. д. FlowLayout– менеджер поточной компоновки. При этом компоненты размещаются от левого верхнего угла окна, слева направо и сверху вниз, как и обычный текст. Этот менеджер используется по умолчанию при добавлении компонентов в апплеты. При использовании библиотеки AWT менеджер FlowLayoutпредставляет собой класс, объявленный следующим образом: public class FlowLayout extends Object implements LayoutManager, Serializable { } /* пример # 1 : поточная компоновка по центру: import java.applet.*; import java.awt.*; public class FlowLayoutEx extends Applet { Component c[] = new Component[6]; public void init() { String[] msg = {"Метка 1", "Метка 2", "Метка 3"}; String[] str = { "--1--", "--2--", "--3--" }; setLayout(new FlowLayout());//по умолчанию setBackground(Color.gray); setForeground(Color.getHSBColor(1f, 1f, 1f)); for (int i = 0; i < c.length - 3; i++) { c[i] = new Button(str[i]); add(c[i]); c[i + 3] = new Label(msg[i]); add(c[i + 3]); } setSize(220, 150); } } Метод setLayout(LayoutManager mgr) устанавливает менеджер размещения для данного контейнера. Результаты работы апплета приведены на рисунке.
Рис. 13.1. Размещение компонентов FlowLayout BorderLayout позволяет позиционировать элементы в областях фиксированного размера, граничащих со сторонами фрейма, которые обозначаются параметрами: NORTH, SOUTH, EAST, WEST. Остальное пространство обозначается как CENTER. /* пример # 2 : фиксированная компоновка по областям: BorderLayoutEx.java */ import java.applet.*; import java.awt.*; public class BorderLayoutEx extends Applet { public void init() { setLayout(new BorderLayout()); add(new Button("--0--"), BorderLayout.WEST); add(new Button("--1--"), BorderLayout.WEST); //кнопка --1-- будет нарисована поверх кнопки --0-- add(new Button("--2--"), BorderLayout.SOUTH); add(new Button("--3--"), BorderLayout.EAST); add(new Label("*BorderLayout*"), BorderLayout.CENTER); add(new Checkbox("Выбор"), BorderLayout.NORTH); setSize(220, 150); } }
Рис. 13.2. Размещение компонентов BorderLayout CardLayout создает вкладки, содержимое которых отображается при выполнении щелчка на заголовке. Каждое размещение можно представлять отдельной пронумерованной картой в колоде, которая может быть перетасована так, чтобы в данный момент наверху находилась любая карта. Рис. 13.4. Размещение компонентов GridLayout
|