
- •Программирование на Java
- •Глава 1 Введение в java. Основы языка.
- •Тема 1.1 Язык программирования java.
- •Тема 1.2 Состав пакета Java2.
- •Тема 1.3 Настройка среды окружения.
- •Тема 1.4 Структура Java-программы.
- •Тема 1.5 Набор текста, запуск и компиляция простейшей программы.
- •Тема 1.6 Подробное рассмотрение кода простейшей программы.
- •Тема 1.7. Создание программы в разных средах разработки.
- •Тема 1.8 Лексические основы языка
- •Тема 1.9 Элементарные типы данных.
- •Тема 1.10 Преобразование типов.
- •Арифметические операции
- •Операции сравнения
- •Тема 1.11 Кoнсольный ввод с помощью класса java.Util.Scanner
- •Тема 1.12 Классы-оболочки
- •Тема 1.13 Автоупакока и автораспаковка.
- •Тема 1.14 Операторы
- •1.14.1 Блок
- •1.14.2 Условный оператор if
- •1.14.4 Оператор цикла while
- •1.14.5 Оператор цикла do-while
- •1.14.6 Оператор цикла for
- •1.14.7 Оператор continue и метки
- •1.14.8 Оператор break
- •1.14.9 Оператор варианта switch
- •Тема 1.15 Статический импорт
- •Тема 1.16 Класс Math
- •Задания
- •Тема 1.17 Псевдослучайные числа
- •Тема 1.18 Генерация случайных чисел
- •Тема 1.19 Массивы в Java
- •1.19.1 Объявление и заполнение массива
- •1.19.2 Сортировка массива
- •Сортировка выбором
- •Сортировка методом пузырька
- •1.19.3 Многомерные массивы
- •Задания
- •1.19.4 Нерегулярные массивы
- •Глава 2 классы
- •Тема 2.1 Основы классов
- •Тема 2.2 Общая форма класса
- •Тема 2.3 Объявление объектов
- •Тема 2.4 Более подробное рассмотрение операции new
- •Тема 2.5 Присваивание переменных объектных ссылок
- •Тема 2.6 Знакомство с методами
- •Тема 2.7 Возвращение значения из метода
- •Тема 2.8 Добавление метода, принимающего параметры
- •Тема 2.9 Конструкторы
- •Тема 2.10 Сборка мусора
- •Тема 2.11 Перегрузка методов
- •Тема 2.12 Перегрузка конструкторов
- •Тема 2.13 Использование объектов в качестве параметров
- •Тема 2.14 Более пристальный взгляд на передачу аргументов
- •Тема 2.16 Рекурсия
- •Тема 2.17 Введение в управление доступом
- •Тема 2.18 Ключевое слово static
- •Тема 2.19 Ключевое слово final
- •Тема 2.20 Аргументы переменной длины
- •Тема 2.21 Строки и числа
- •Тема 2.22 Нумерованные типы
- •Глава 3 наследование и интерфейсы
- •Тема 3.1 Основы наследования
- •Тема 3.2 Наследование и доступ к членам класса
- •Тема 3.3 Конструкторы и наследование
- •Тема 3.4 Использование ключевого слова super для вызова конструктора суперкласса
- •Тема 3.5 Использование ключевого слова super для доступа к членам суперкласса
- •Тема 3.6 Многоуровневая иерархия
- •Тема 3.7 Когда вызываются конструкторы
- •Тема 3.8 Объекты подклассов и ссылки на суперклассы
- •Тема 3.9 Переопределение методов
- •Тема 3.10 Переопределение методов и поддержка полиморфизма
- •Тема 3.11 Использование абстрактных классов
- •Тема 3.12 Использование ключевого слова final
- •Тема 3.13 Предотвращение переопределения методов
- •Тема 3.14 Предотвращение наследования
- •Тема 3.15 Класс Object
- •Тема 3.16 Интерфейсы
- •3.16.1 Объявление интерфейса.
- •3.16.2 Реализация интерфейсов
- •3.16.3 Использование ссылок на интерфейсы
- •3.16.4 Переменные в составе интерфейсов
- •3.16.5 Наследование интерфейсов
- •Тема 3.17 Пакеты и ограничение доступа
- •Тема 3.18 Внутренние классы
- •3.18.1 Внутренние (inner) классы
- •3.18.2 Вложенные (nested) классы
- •3.18.3 Анонимные (anonymous) классы
- •Глава 4 Обработка исключительных ситуаций
- •Тема 4.1 Исключения в Java
- •Тема 4.2 Типы исключений
- •Тема 4.3 Неперехваченные исключения
- •Тема 4.4 Ключевые слова try и catch
- •Тема 4.6 Ключевое слово throw
- •Тема 4.7 Ключевое слово throws
- •Тема 4.8 Ключевое слово finally
- •Ошибка при выполнении метода1 java.Lang.ArithmeticException: Demo
- •Тема 4.9 Потомки Exception или написание своих классов ошибок
- •Глава 5 Универсальные типы. КоллекциИ
- •Тема 5.1 Общие сведения об универсальных типах
- •Тема 5.2 Универсальный класс с двумя параметрами типа
- •Тема 5.3 Ограниченные типы
- •Тема 5.4 Использование групповых параметров
- •Тема 5.5 Универсальные методы
- •Тема 5.6 Универсальные интерфейсы
- •Тема 5.7 Ошибки неоднозначности
- •Тема 5.8 Ограничения универсальных типов
- •Тема 5.9 Краткий обзор коллекций
- •5.9.1 Класс ArrayList
- •5.9.2 Класс LinkedList
- •5.9.3 Класс HashSet
- •5.9.4 Класс TreeSet
- •5.9.5 Доступ к коллекции через итератор
- •5.9.6 Алгоритмы коллекций
- •Глава 6 jdbc (Java DataBase Connectivity) Тема 6.1 Драйверы, соединения и запросы
- •Тема 6.2 Простое соединение и простой запрос
- •Тема 6.2 Класс ResultSet
- •Тема 6.3 Метаданные
- •Тема 6.4 Подготовленные запросы
- •Глава 7 Swing и пользовательский интерфейс
- •Тема 7.1 Общие сведения о swing
- •Тема 7.2 Архитектура mvc
- •Тема 7.3 Контейнер и компоненты
- •Тема 7.4 Простая программа, использующая средства Swing
- •Тема 7.5 Поддержка событий
- •Тема 7.6 Использование кнопок и обработка событий
- •Тема 7.7 Краткие сведения о диспетчерах компоновки
- •Тема 7.8 Пример использования jdbc и swing вместе
Тема 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(), принадлежащего источнику. Для каждого типа события определен собственный метод регистрации. Заголовок метода имеет вид, подобный представленному ниже.
public void addТипListener(ТипListener el)
где тип – это имя события, а параметр el представляет собой ссылку на обработчик события. Например, метод, регистрирующий обработчик событий клавиатуры, называется addKeyListener(). Для регистрации событий, связанных с перемещением мыши, используется метод addMouseMotionListener(). О возникшем событии оповещаются все обработчики.
Источник должен также предоставлять метод, позволяющий отменить регистрацию обработчика событий определенного типа. Этот метод имеет заголовок, представленный в следующей форме:
public void removeТипListener(ТипListener el)
где тип – это имя события, а параметр 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 Классы адаптеры
Класс адаптера |
Реализуемый интерфейс |
FocusAdapter |
FocusListener |
KeyAdapter |
KeyListener |
MouseAdapter |
MouseListener |
MouseMotionAdapter |
MouseMotionListener |
MouseInputAdapter |
MouseListener и MouseMotionListener |
WindowAdapter |
WindowListener |