Архитектура Аудит Военная наука Иностранные языки Медицина Металлургия Метрология Образование Политология Производство Психология Стандартизация Технологии |
Тема 7.4 Простая программа, использующая средства Swing
Перед тем как продолжить обсуждение теоретических вопросов, желательно рассмотреть в качестве примера простую программу, созданную с использованием средств Swing. Несмотря на простоту, данная программа демонстрирует ключевые свойства Swing и дает представление о контейнере JFrame и компоненте JLabel. Как было сказано ранее, JFrame – это контейнер верхнего уровня, обычно используемый в приложениях Swing. JLabel –компонент Swing, с помощью которого создается метка, используемая для представления информации. Метка – самый простой компонент Swing, поскольку он не реагирует на действия пользователя, а лишь отображает данные. В данной программе создается контейнер JFrame, в который помещается экземпляр компонента JLabel, отображающий текстовое сообщение. Листинг 7.1 import javax.swing.JFrame; import javax.swing.JLabel; public class MyFrame { public MyFrame() { //созданиефрейма JFrame fr = new JFrame(" Заголовок" ); //установка размеров фрейма fr.setSize(200, 100); // создание метки JLabel label = new JLabel(" Тестовый текст" ); // добавление метки к фрейму fr.add(label); // установка операции по нажатию на крестик fr.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); // прорисовкафрейма fr.setVisible(true); } }
public class Main { public static void main(String[] args) { new MyFrame(); } }
Данная программа компилируется и запускается так же, как и любое Java-приложение. В процессе работы программа отображает окно, показанное на рисунке 7.1. Рисунок 7.1
Тема 7.5 Поддержка событий
Предыдущий пример продемонстрировал основы Swing-программы, но в ней не нашел отражение важнейший вопрос: поддержка событий. Поскольку JLabel не принимает данных от пользователя, он не генерирует событий, поэтому при работе с данным компонентом обработчик событий не нужен. Однако другие управляющие элементы Swing реагируют на действия пользователя, и генерируемые ими события должны быть обработаны. Например, события генерируются по щелчку мышью на кнопке, нажатию клавиши на клавиатуре или при выборе элемента списка. Существуют события, непосредственно не связанные с действиями пользователей. Например, событие генерируется по истечении интервала времени, установленного для таймера. Независимо от причины того или иного события, средства, обрабатывающие их, являются важной частью любого Swing-приложения. В Swing используется тот же механизм обработки событий, что и в AWT. Он носит название модель делегирования событий. Этот механизм достаточно прост. Источник генерирует событие, которое передается одному или нескольким обработчикам. В рамках данной схемы обработчики лишь ожидают возникновения события. При возникновении события они обрабатывают его и возвращают управление. Преимущество такого подхода в том, что логика обработки событий отделена от логики пользовательского интерфейса, генерирующего эти события. Элемент интерфейса " делегирует" обработку события отдельному фрагменту кода. В модели делегирования событий обработчик, чтобы получать оповещения о событиях, должен быть зарегистрирован в источнике. Согласно модели делегирования, событие является объектом, описывающим изменения состояния источника. Событие может быть следствием действий пользователя с элементом графического интерфейса или сгенерировано программными средствами. Супреклассом всех событий является java.util.EventObject. Многие события объявлены в пакете java.awt.event, но некоторые содержатся в javax.swing.event. Источник события – это объект, сгенерировавший его. Сгенерировав событие, источник должен передать его всем зарегистрированным обработчикам. Следовательно, чтобы обработчик получил событие, он должен быть зарегистрирован в источнике. Регистрация осуществляется путем вызова метода addТипListener(), принадлежащего источнику. Для каждого типа события определен собственный метод регистрации. Заголовок метода имеет вид, подобный представленному ниже. publicvoidaddТипListener(ТипListenerel) где тип – это имя события, а параметр el представляет собой ссылку на обработчик события. Например, метод, регистрирующий обработчик событий клавиатуры, называется addKeyListener(). Для регистрации событий, связанных с перемещением мыши, используется метод addMouseMotionListener(). О возникшем событии оповещаются все обработчики. Источник должен также предоставлять метод, позволяющий отменить регистрацию обработчика событий определенного типа. Этот метод имеет заголовок, представленный в следующей форме: publicvoidremoveТипListener(ТипListenerel) где тип – это имя события, а параметр el –ссылка на обработчик. Например, для того, чтобы удалить обработчик событий клавиатуры, надо вызвать метод removeKeyListener(). Методы, добавляющие или удаляющие обработчики, принадлежат объектам-источникам событий. Например, класс JButton содержит методы для регистрации отмены обработчика ActionListener. Будучи зарегистрированным, этот обработчик получает оповещение о действиях с кнопкой. Обработчик событий – это объект, оповещаемый о возникновении события. К нему предъявляются два основных требования. Во-первых, чтобы получать оповещение о конкретном типе событий, он должен быть зарегистрирован в одном или нескольких источниках. Во-вторых, он должен реализовывать метод, предназначенный для обработки события. Методы, позволяющие получать и обрабатывать события, определены в интерфейсах, содержащихся в пакетах java.awt.event, javax.swing.event и java.beans. Например, в интерфейсе ActionListener объявлен метод, который вызывается тогда, когда пользователь щелкает на кнопке или выполняет другое действие, затрагивающее компонент. Это событие может быть обработано любым объектом, при условии, что он реализует интерфейс ActionListener. Общие правила, которые следует учитывать при обработке событий, таковы. Обработчик должен выполнять свою задачу быстро и возвращать управление. По возможности он не должен осуществлять сложные операции, поскольку это может замедлить работу всего приложения. Если же необходимы действия, занимающие длительное время, для их выполнения следует создавать отдельный поток. Классы, представляющие события, лежат в основе механизма обработки события Java. Эти классы формируют иерархическую структуру, на вершине которой находится класс EventObject, принадлежащий пакету java.util. Он является суперклассом для всех событий. Класс AWTEvent, объявленный в пакете java.awt, представляет собой подкласс EventObject. Он, в свою очередь, является родительским классом для всех событий AWT, используемых в модели делегирования событий. Swing использует события AWT и, кроме того, определяет несколько дополнительных событий. Как упоминалось ранее, соответствующие классы определены в пакете javax.swing.event. В таблице 7.2 описаны некоторые классы событий и соответствующие им интерфейсы обработчиков, определенные в пакете java.awt.event. В таблице 7.3 приведено несколько классов событий и интерфейсов обработчиков из пакета javax.swing.event. Конкретные классы и интерфейсы будут подробно описываться по мере того, как они будут использоваться.
Таблица 7.2 Некоторые классы событий из пакета java.awt.event
Несмотря на то, что большинство интерфейсов обработчиков событий реализовать нетрудно. Java предоставляет набор классов адаптеров, в которых уже определены методы, объявленные в интерфейсах обработчиков. Классы адаптеров удобны тогда, когда вы собираетесь использовать лишь некоторые из событий, предусмотренных в интерфейсе. Новый класс, выполняющий функции обработчика, можно создать как подкласс класса адаптера, переопределив в нем интересующие вас методы. Поскольку при использовании адаптера отпадает необходимость определять все методы, объявленные в интерфейсе обработчика, уменьшается объем кода и трудозатраты по его написанию. Адаптеры часто применяются при реализации неименованных внутренних классов, что также упрощает код программы. Для некоторых интерфейсов обработчиков адаптеры отсутствуют. Например, для ActionEvent адаптер не создан, поскольку в данном интерфейсе объявлен лишь один метод. Адаптеры создаются только для тех интерфейсов, в которых предусмотрено более одного метода. Например, в составе MouseMotionListener присутствуют два метода: mouseDragged() и mouseMoved (). Реализации этих методов, не выполняющие никаких действий, определены в классе MouseMotionAdapter. Если вас интересуют только события, связанные с перетаскиванием мыши, вам следует создать обработчик как подкласс MouseMotionAdapter и реализовать в нем метод mouseDragged(). Пустой метод mouseMoved(), унаследованный от суперкласса, будет обрабатывать события перемещения мыши. Ниже перечислено несколько классов адаптеров. Большинство из них определено в пакете java.awt.event, однако класс MouseInputAdapter содержится в пакете javax.swing.event. Таблица 7.4 Классы адаптеры Популярное:
|
Последнее изменение этой страницы: 2016-05-30; Просмотров: 523; Нарушение авторского права страницы