Архитектура Аудит Военная наука Иностранные языки Медицина Металлургия Метрология
Образование Политология Производство Психология Стандартизация Технологии


Тема 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

Класс события Описание Обработчик
ActionEvent Генерируется при выполнении действий с интерфейсным элементом, например по щелчку на кнопке ActionListener
AdjustmentEvent Генерируется при выполнении действий с полосой прокрутки AdjustmentListener
FocusEvent Генерируется тогда, когда компонент получает или теряет фокус ввода FocusListener
ItemEvent Генерируется при выборе или отмене выбора элемента, например, по щелчку на флажке опций ItemListener
KeyEvent Генерируется при вводе данных с клавиатуры KeyListener
MouseEvent Генерируется при перемещении или перетаскивании мыши, нажатии или отпускании клавиши, а также при помещении курсора мыши на компонент или выводе курсора за пределы компонента MouseListener и MouseMotionListener
MouseWheelEvent Генерируется при движении колесика мыши MouseWheelListener
WindowEvent Генерируется при активизации, деактивизации, закрытии, окна, сворачивании его в пиктограмму и разворачивании из пиктограммы WindowListener
  Таблица 7.3 Некоторые классы событий из пакета javax.swing.event
Класс события Описание Обработчик
AncestorEvent Генерируется при добавлении, перемещении или удалении предка компонента AncestorListener
GaretEvent Генерируется при изменении позиции курсора в текстовом компоненте CaretListener
ChangeEvent Генерируется при изменении состояния компонента ChangeListener
HyperlinkEvent Генерируется при действиях с гипертекстовой ссылкой HyperlinkListener
ListDataEvent Генерируется при изменении содержимого списка ListDataListener
ListSelectionEvent Генерируется при выборе или отмене выбора пунктов списка ListSelectionListener
MenuEvent Генерируется при выборе или отмене выбора пунктов меню MenuLxstener
TableModelEvent Генерируется при изменении модели таблицы TableModelListener
TreeExpansionEvent Генерируется при разворачивании или сворачивании дерева TreeExpansionListener
TreeModelEvent Генерируется при изменении модели дерева TreeModelListener
TreeSelectionEvent Генерируется при выборе узла дерева TreeSelectionListener
         

Несмотря на то, что большинство интерфейсов обработчиков событий реализовать нетрудно. Java предоставляет набор классов адаптеров, в которых уже определены методы, объявленные в интерфейсах обработчиков. Классы адаптеров удобны тогда, когда вы собираетесь использовать лишь некоторые из событий, предусмотренных в интерфейсе. Новый класс, выполняющий функции обработчика, можно создать как подкласс класса адаптера, переопределив в нем интересующие вас методы. Поскольку при использовании адаптера отпадает необходимость определять все методы, объявленные в интерфейсе обработчика, уменьшается объем кода и трудозатраты по его написанию. Адаптеры часто применяются при реализации неименованных внутренних классов, что также упрощает код программы.

Для некоторых интерфейсов обработчиков адаптеры отсутствуют. Например, для ActionEvent адаптер не создан, поскольку в данном интерфейсе объявлен лишь один метод. Адаптеры создаются только для тех интерфейсов, в которых предусмотрено более одного метода. Например, в составе MouseMotionListener присутствуют два метода: mouseDragged() и mouseMoved (). Реализации этих методов, не выполняющие никаких действий, определены в классе MouseMotionAdapter. Если вас интересуют только события, связанные с перетаскиванием мыши, вам следует создать обработчик как подкласс MouseMotionAdapter и реализовать в нем метод mouseDragged(). Пустой метод mouseMoved(), унаследованный от суперкласса, будет обрабатывать события перемещения мыши.

Ниже перечислено несколько классов адаптеров. Большинство из них определено в пакете java.awt.event, однако класс MouseInputAdapter содержится в пакете javax.swing.event.

Таблица 7.4 Классы адаптеры


Поделиться:



Популярное:

Последнее изменение этой страницы: 2016-05-30; Просмотров: 481; Нарушение авторского права страницы


lektsia.com 2007 - 2024 год. Все материалы представленные на сайте исключительно с целью ознакомления читателями и не преследуют коммерческих целей или нарушение авторских прав! (0.016 с.)
Главная | Случайная страница | Обратная связь