
- •Программирование на 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.7 Краткие сведения о диспетчерах компоновки
Расположение компонентов в составе контейнера определяется диспетчером компоновки, связанным с этим контейнером. Диспетчер можно отключить, написав setLayout(null), тогда позиционирование будет ручное, т.е. каждой компоненте нужно задать ее координаты и размеры. В Java определено несколько диспетчеров компоновки. Большинство из них входят в состав AWT (пакет java.awt), но Swing также предоставляет несколько дополнительных диспетчеров компоновки. Все диспетчеры являются экземплярами классов, реализующих интерфейс LayoutManager. В таблице 7.5 описано несколько диспетчеров компоновки, доступных программистам, использующим средства Swing.
Таблица 7.5 – Диспетчеры компоновки
Диспетчер компоновки |
Описание |
FlowLayout |
Располагает компоненты в строке слева направо; следующая строка размещается под предыдущей. (Установки для некоторых стран предполагают следование компонентов в строке справа налево.) |
BorderLayout |
Помещает компоненты в пяти областях, расположенных по центру и по краям контейнера. По умолчанию такой диспетчер компоновки связан с панелью содержимого |
GridLayout |
Располагает компоненты в виде таблицы |
GridBagLayout |
Располагает компоненты в виде таблицы с ячейками различных размеров |
BoxLayout |
Располагает компоненты по вертикали или по горизонтали |
SpringLayout |
Использует при размещении компонентов специальные ограничения |
До сих пор вам встречались два диспетчера: BorderLayout (который по умолчанию связан с панелью содержимого фрейма) и FlowLayout. Сейчас обратим более пристальное внимание на BorderLayout, поскольку именно он используется по умолчанию с панелью содержимого контейнера верхнего уровня.
Диспетчер BorderLayout определяет в составе контейнера пять областей, в которые могут помещаться компоненты. Первая область расположена по центру окна. Остальные четыре – по краям. Соответственно области называются центральной (center), северной (north), южной (south), восточной (east) и западной (wesf). По умолчанию компонент, помещаемый в панель содержимого, располагается в центральной области. Явным образом управлять размещением компонентов можно, используя специальную форму метода add().
void add(Component comp, Object loc)
где параметр comp задает компонент, добавляемый к панели, а параметр loc определяет область, в которую этот компонент будет помещен. Допустимо одно из следующих значений параметра loc:
BorderLayout.CENTER
BorderLayout.NORTH
BorderLayout.EAST
BorderLayout.SOUTH
BorderLayout.WEST
Диспетчер компоновки BorderLayout наиболее удобен, если вы создаете объект JFrame, который должен содержать лишь один компонент (он размещается в центре окна), или если вам надо включить группу компонентов, расположенных на панели.
Тема 7.8 Пример использования jdbc и swing вместе
Приведем пример постоения таблицы на основе выборки из базы данных. В данном примере были спользованы классы DB, User, WorkTableUser из листинга 6.5. Показан класс MyTable потомок класса JTable, с помощью которого строится таблица по объекту класса ResultSet. В класса MyFrame данный объект добавлен к главной панели.
Листинг 7.4
//класс для создания таблицы
import java.sql.*;
import java.util.Vector;
import javax.swing.JTable;
import javax.swing.table.DefaultTableModel;
public class MyTable extends JTable {
public MyTable(ResultSet rs) {
DefaultTableModel dft = new DefaultTableModel();
ResultSetMetaData rsmd;
try {
rsmd = rs.getMetaData();
for (int i = 1; i <= rsmd.getColumnCount(); i++) {
dft.addColumn(rsmd.getColumnName(i));
}
while (rs.next()) {
Vector v = new Vector();
for (int i = 1; i <= rsmd.getColumnCount(); i++) {
v.add(rs.getString(i));
}
dft.addRow(v);
}
setModel(dft);
setAutoResizeMode(AUTO_RESIZE_ALL_COLUMNS);
} catch (SQLException ex) {
// TODO Auto-generated catch block
System.out.println("Error in MyTable " + ex);
}
}
}
//фрейм, содержащий таблицу
import java.awt.event.*;
import java.sql.ResultSet;
import javax.swing.*;
public class MyFrame extends JFrame {
private JPanel panel;
private JLabel label1, label2;
private JButton button1, button2, button3;
private JTextField textField1, textField2;
private MyTable table;
private DB db;
private JScrollPane scroll;
private MouseAdapter mouse;
public MyFrame() {
//установка заголовка и размеров фрейма
setTitle("Заголовок");
setBounds(500, 200, 500, 350);
panel = new JPanel(null);
//подключение к базе данных
db = new DB("jdbc:mysql://localhost/", "my_db", "root", "");
//создание таблицы
table = new MyTable(db.query("SELECT * FROM user"));
//добавление таблицы в скролл, а скролла к панели
scroll = new JScrollPane(table);
scroll.setBounds(50, 50, 200, 150);
panel.add(scroll);
//создание всех компонент
label1 = new JLabel("Id");
label2 = new JLabel("Name");
button1 = new JButton("Add");
button2 = new JButton("Delete");
button3 = new JButton("Change");
textField1 = new JTextField(String.valueOf(Integer.valueOf(table.getValueAt(table.getRowCount() - 1, 0).toString()) + 1));
textField2 = new JTextField();
//позиционирование
label1.setBounds(300, 50, 150, 20);
textField1.setBounds(300, 90, 150, 20);
label2.setBounds(300, 130, 150, 20);
textField2.setBounds(300, 170, 150, 20);
button1.setBounds(50, 250, 100, 20);
button3.setBounds(170, 250, 100, 20);
button2.setBounds(290, 250, 100, 20);
// добавление компонент к панели
panel.add(label1);
panel.add(label2);
panel.add(button1);
panel.add(button2);
panel.add(button3);
panel.add(textField1);
panel.add(textField2);
//добавление панели к фрейму
add(panel);
//добавление кнопок к прослушиванию
button1.addActionListener(new ActionListener() {
@Override
public void actionPerformed(ActionEvent e) {
db.addUser(new User(Integer.valueOf(textField1.getText()), textField2.getText()));
updateTable();
textField1.setText(String.valueOf(Integer.valueOf(table.getValueAt(table.getRowCount() - 1, 0).toString()) + 1));
}
});
button2.addActionListener(new ActionListener() {
@Override
public void actionPerformed(ActionEvent e) {
db.deleteUser(new User(Integer.valueOf(textField1.getText()), textField2.getText()));
updateTable();
textField1.setText(String.valueOf(Integer.valueOf(table.getValueAt(table.getRowCount() - 1, 0).toString()) + 1));
}
});
button3.addActionListener(new ActionListener() {
@Override
public void actionPerformed(ActionEvent e) {
db.changeNameUser(new User(Integer.valueOf(textField1.getText()), textField2.getText()));
updateTable();
textField1.setText(String.valueOf(Integer.valueOf(table.getValueAt(table.getRowCount() - 1, 0).toString()) + 1));
}
});
mouse = new MouseAdapter() {
@Override
public void mouseClicked(MouseEvent e) {
textField1.setText(table.getValueAt(table.getSelectedRow(), 0).toString());
textField2.setText(table.getValueAt(table.getSelectedRow(), 1).toString());
}
};
table.addMouseListener(mouse);
// установка операции по нажатию на крестик
setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
// прорисовка фрейма
setVisible(true);
}
public void updateTable() {
panel.remove(scroll);
table = new MyTable(db.query("SELECT * FROM user"));
table.addMouseListener(mouse);
scroll = new JScrollPane(table);
scroll.setBounds(50, 50, 200, 150);
panel.add(scroll);
panel.updateUI();
}
}
В результате запуска данного кода получим фрейм, изображенный на рисунке 7.4
Рисунок 7.4
При нажатии на кнопку Add новый пользователь добавляется в базу данных, Change – меняется имя, Delete – пользователь удаляется из БД и таблица обновляется. На рисунке 7.5 показан фрейм после добавления user7, удаления user2 и редактирование user3.
Рисунок 7.5
В данном методическом пособии были показаны примеры использования лишь некоторых компонент. Библиотека swing дает большие возможности для создания пользовательских интерфейсов, поэтому рекомендуем продолжить изучение данной библиотеки по документации или по специальным справочникам по swing.
Выводы к главе:
Swing представляет собой набор классов, применяемых для создания графических пользовательских интерфейсов (Graphical User Interface – GUI) современных приложений, в том числе Web-программ.
Swing поддерживает настраиваемые стили.
Визуальный компонент можно представить себе как элемент, сочетающий следующие характеристики.
Способ отображения на экране.
Реакция на действия пользователя.
Информация, связанная с данным компонентом.
Компоненты – это независимые элементы, в качестве примеров которых можно привести кнопки или линейные регуляторы.
Контейнер может содержать в себе несколько компонентов и представляет собой специальный тип компонента.
В Swing используется тот же механизм обработки событий, что и в AWT, – это модель делегирования событий.
Согласно модели делегирования, событие является объектом, описывающим изменения состояния источника.
Источник события – это объект, сгенерировавший его. Сгенерировав событие, источник должен передать его всем зарегистрированным обработчикам.
Обработчик событий – это объект, оповещаемый о возникновении события.
Java предоставляет набор классов адаптеров, в которых уже определены методы, объявленные в интерфейсах обработчиков. Классы адаптеров удобны тогда, когда вы собираетесь использовать лишь некоторые из событий, предусмотренных в интерфейсе.
Расположение компонентов в составе контейнера определяется диспетчером компоновки, связанным с этим контейнером. Диспетчер можно отключить, написав setLayout(null), тогда позиционирование будет ручное, т.е. каждой компоненте нужно задать ее координаты и размеры.
Задания к главе:
Разработать приложение с пользовательским интерфейсом, работающее с базой данных.
Система Факультатив. Преподаватель объявляет запись на Курс. Студент записывается на Курс, обучается и по окончании Преподаватель выставляет Оценку, которая сохраняется в Архиве. Студентов, Преподавателей и Курсов при обучении может быть несколько.
Система Платежи. Клиент имеет Счет в банке и Кредитную Карту (КК). Клиент может оплатить Заказ, сделать платеж на другой Счет, заблокировать КК и аннулировать Счет. Администратор может заблокировать КК за превышение кредита.
Система Больница. Пациенту назначается лечащий Врач. Врач может сделать назначение Пациенту (процедуры, лекарства, операции). Медсестра или другой Врач выполняют назначение. Пациент может быть выписан из Больницы по окончании лечения, при нарушении режима или при иных обстоятельствах.
Система Вступительные экзамены. Абитуриент регистрируется на Факультет, сдает Экзамены. Преподаватель выставляет Оценку. Система подсчитывает средний балл и определяет Абитуриентов, зачисленных в учебное заведение.
Система Библиотека. Читатель оформляет Заказ на Книгу. Система осуществляет поиск в Каталоге. Библиотекарь выдает Читателю Книгу на абонемент или в читальный зал. При невозвращении Книги Читателем он может быть занесен Администратором в «черный список».
Система Конструкторское бюро. Заказчик представляет Техническое Задание (ТЗ) на проектирование многоэтажного Дома. Конструктор регистрирует ТЗ, определяет стоимость проектирования и строительства, выставляет Заказчику Счет за проектирование и создает Бригаду Конструкторов для выполнения Проекта.
Система Телефонная станция. Абонент оплачивает Счет за разговоры и Услуги, может попросить Администратора сменить номер и отказаться от услуг. Администратор изменяет номер, Услуги и временно отключает Абонента за неуплату.
Система Автобаза. Диспетчер распределяет заявки на Рейсы между Водителями и назначает для этого Автомобиль. Водитель может сделать заявку на ремонт. Диспетчер может отстранить Водителя от работы. Водитель делает отметку о выполнении Рейса и состоянии Автомобиля.
Система Интернет-магазин. Администратор добавляет информацию о Товаре. Клиент делает и оплачивает Заказ на Товары. Администратор регистрирует Продажу и может занести неплательщиков в «черный список».
Система Железнодорожная касса. Пассажир делает Заявку на станцию назначения, время и дату поездки. Система регистрирует Заявку и осуществляет поиск подходящего Поезда. Пассажир делает выбор Поезда и получает Счет на оплату. Администратор вводит номера Поездов, промежуточные и конечные станции, цены.
Система Городской транспорт. На Маршрут назначаются Автобус, Троллейбус или Трамвай. Транспортные средства должны двигаться с определенным для каждого Маршрута интервалом. При поломке на Маршрут должен выходить резервный транспорт или увеличиваться интервал движения.
Система Аэрофлот. Администратор формирует летную Бригаду (пилоты, штурман, радист, стюардессы) на Рейс. Каждый Рейс выполняется Самолетом с определенной вместимостью и дальностью полета. Рейс может быть отменен из-за погодных условий в Аэропорту отлета или назначения. Аэропорт назначения может быть изменен в полете из-за технических неисправностей, о которых сообщил командир.
Система Периодические издания. Читатель может сделать Заявку, предварительно выбрав периодические Издания из списка. Система подсчитывает сумму для оплаты. Читатель оплачивает заявку. Администратор добавляет Заявку в «черный список», если Клиент не оплачивает её в определённый срок.
Система Заказ гостиницы. Клиент оставляет Заявку на Номер, указав количество мест в номере, класс апартаментов и время пребывания. Администратор рассматривает Заявку, подтверждает или отклоняет её. Результат просматривает Клиент. В случае подтверждения Заявки Клиент оплачивает услуги.
Система Жилищно-коммунальные услуги. Квартиросъемщик отправляет Заявку, в которой указывает род работ, масштаб и желаемое время выполнения. Диспетчер формирует соответствующую Бригаду и регистрирует её в Плане работ. Диспетчер может отклонить Заявку в случае занятости всех Бригад.
Система Прокат автомобилей. Клиент выбирает Автомобиль из списка доступных, заполняет форму Заказа, указывая паспортные данные, срок аренды. Администратор может отклонить Заявку, указав причины отказа. При подтверждении Заявки Клиент оплачивает Заказ. Система выписывает сумму. В случае повреждения Автомобиля Клиентом Администратор вносит соответствующие пометки.
ЗАКЛЮЧЕНИЕ
В настоящее время Java один из наиболее популярных и перспективных языков, область применения которого с каждым днем становится все шире. Изучив данное методическое пособие, Вы получили лишь базовые знания по JavaSE – сделали первый шаг на пути изучения этого широко востребованного языка. Изучив основы языка, у Вас есть два варианта продолжения Вашего обучения и развития:
изучить JavaEE на “Продвинутом курсе по Java” и заниматься разработкой под web;
изучить JavaME на “Программировании под Android” и заниматься разработкой приложений под платформу Android.
Каждый выбирает то, что ближе ему. Главное не останавливаться в развитии и продолжать обучение, набраться опыта и стать успешным Java- программистом.
Если у Вас возникли какие-либо вопросы, замечания или предложения по данному методическому пособию, то присылайте их на адрес KarsekaEV@tut.by.
С уважением, Елена Карсека
СПИСОК ИСПОЛЬЗОВАННЫХ ИСТОЧНИКОВ
Г.Шилдт. Полный справочник по Java. - Изд. дом “Вильямс”,2007
Б.Эккель. Философия Java. – Изд-во. Питер, 2009
К.С.Хорстманн, Г.Корнелл. Java 2. Том 1. Основы. - Изд. дом “Вильямс”,2003
К.С.Хорстманн, Г.Корнелл. Java 2. Том 2. Тонкости программирования. - Изд. дом “Вильямс”,2003
И.Н.Блинов, В.С.Романчик. Промышленное программирование: практич. Пособие –Изд. УниверсалПресс, Минск, 2007
И.Шабан. Методические материалы