0% нашли этот документ полезным (0 голосов)
8 просмотров65 страниц

Java

Документ представляет собой лабораторный практикум по языку программирования Java, предназначенный для студентов специальностей 'Экономика и организация производства' и 'Маркетинг'. Вторая часть практикума включает четыре лабораторные работы, охватывающие разработку апплетов, организацию потоков, создание графического пользовательского интерфейса и работу с базами данных. Основное внимание уделяется особенностям графических возможностей Java и разработке приложений с оконным интерфейсом.

Загружено:

indira.8888
Авторское право
© © All Rights Reserved
Мы серьезно относимся к защите прав на контент. Если вы подозреваете, что это ваш контент, заявите об этом здесь.
Доступные форматы
Скачать в формате PDF, TXT или читать онлайн в Scribd
0% нашли этот документ полезным (0 голосов)
8 просмотров65 страниц

Java

Документ представляет собой лабораторный практикум по языку программирования Java, предназначенный для студентов специальностей 'Экономика и организация производства' и 'Маркетинг'. Вторая часть практикума включает четыре лабораторные работы, охватывающие разработку апплетов, организацию потоков, создание графического пользовательского интерфейса и работу с базами данных. Основное внимание уделяется особенностям графических возможностей Java и разработке приложений с оконным интерфейсом.

Загружено:

indira.8888
Авторское право
© © All Rights Reserved
Мы серьезно относимся к защите прав на контент. Если вы подозреваете, что это ваш контент, заявите об этом здесь.
Доступные форматы
Скачать в формате PDF, TXT или читать онлайн в Scribd
Вы находитесь на странице: 1/ 65

Министерство образования Республики Беларусь

Учреждение образования
«Белорусский государственный университет
информатики и радиоэлектроники»

Кафедра экономической информатики

Р
УИ
ЯЗЫКИ ПРОГРАММИРОВАНИЯ ДЛЯ РАЗРАБОТКИ СЕТЕВЫХ

БГ
ПРИЛОЖЕНИЙ: ЯЗЫК ПРОГРАММИРОВАНИЯ JAVA

ЛАБОРАТОРНЫЙ ПРАКТИКУМ
а
для студентов специальностей
I-27 01 01 «Экономика и организация производства»,
ек

I-26 02 03 «Маркетинг»
дневной формы обучения
т
ио

В 2-х частях

Часть 2
бл
Би

Минск 2008

1
УДК 681.3.061(075.8)
ББК 32.973.26-018.1 я 73
Я 41

Рецензент
профессор кафедры интеллектуальных информационных
технологий Белорусского государственного университета
информатики и радиоэлектроники Н. А. Гулякина

Р
А в т о р ы:
Т. М. Унучек, Д. А. Сторожев, Е. Н. Унучек,

УИ
В. Н. Комличенко, Д. С. Марудов

БГ
Языки программирования для разработки сетевых приложений:
Я 41 язык программирования JAVA: лаб. практикум для студ. спец. I-27 01 01
«Экономика и организация производства», I-26 02 03 «Маркетинг» днев.
формы обуч. В 2 ч. Ч. 2 / Т. М. Унучек [и др.]. – Минск : БГУИР, 2008. –
а
64 с.
ек

ISBN 978-985-444-910-4 (ч. 2)

В лабораторном практикуме излагаются основы платформно-независимого


т

объектно-ориентированного языка программирования Java 2, приведено описание


основных его библиотек и классов.
Вторая часть практикума состоит из четырех лабораторных работ, нацеленных
ио

на разработку апплетов, организацию работы с потоками, создание графического


пользовательского интерфейса, работу с базами данных. Каждая лабораторная работа
содержит основной теоретический материал по тематике работы, сопровождается
бл

большим числом примеров и законченных программ.


Би

Часть 1 вышла в БГУИР в 2007 г.

УДК 681.3.061(075.8)
ББК 32.973.26-018.1 я 73

ISBN 978-985-444-910-4 (ч. 2) © УО «Белорусский государственный


ISBN 978-985-488-081-5 университет информатики
и радиоэлектроники», 2008
2
СОДЕРЖАНИЕ

Введение ..................................................................................................................5
Лабораторная работа №1. Разработка апплетов, работа с графикой ............6
Пакет AWT............................................................................................................6
Класс Applet ..........................................................................................................7
Инициализация и завершение апплета................................................................8
Запуск апплетов....................................................................................................8
Рисование линий в апплете ..................................................................................9
Рисование прямоугольников в апплете ...............................................................9

Р
Рисование эллипсов и кругов в апплете............................................................10
Рисование дуг в апплете.....................................................................................10

УИ
Работа с цветом...................................................................................................11
Задания для самостоятельного выполнения .....................................................15
Лабораторная работа №2. Разработка апплетов с использованием

БГ
потоков и их синхронизации ..............................................................................17
Многопоточное программирование ..................................................................17
Приоритеты потоков ..........................................................................................17
Класс Thread. Интерфейс Runnable....................................................................17
а
Создание потоков. Жизненный цикл потока ....................................................18
Синхронизация потоков .....................................................................................19
ек

Задания для самостоятельного выполнения .....................................................30


Лабораторная работа №3. Разработка пользовательского интерфейса с
т

использованием фреймов, элементов управления .........................................32


События...............................................................................................................32
Классы событий..................................................................................................32
ио

Класс ActionEvent ...............................................................................................33


FocusEvent ...........................................................................................................34
бл

ItemEvent .............................................................................................................34
KeyEvent..............................................................................................................34
MouseEvent..........................................................................................................35
Би

TextEvent .............................................................................................................35
WindowEvent.......................................................................................................36
Элементы-источники событий ..........................................................................36
Интерфейсы прослушивания событий ..............................................................37
Классы пакета AWT Component, Window, Frame .............................................38
Элементы управления Label, Button, Checkbox, Choice, List, Scrollbar ...........40
Элементы управления TextField и TextArea .....................................................44
Диалоговые окна.................................................................................................47
Задания для самостоятельного выполнения .....................................................49
3
Лабораторная работа №4. Разработка пользовательского интерфейса
для работы с базами данных ..............................................................................53
Интерфейс JDBC ................................................................................................53
Типы драйверов в JDBC.....................................................................................56
Последовательность работы с базами данных..................................................56
Задания для самостоятельного выполнения .....................................................62
Литература ............................................................................................................64

Р
УИ
БГ
а
ек
т
ио
бл
Би

4
ВВЕДЕНИЕ

Лабораторный практикум является второй частью лабораторного цикла


работ по курсу «Языки программирования для разработки сетевых приложний:
язык программирования JAVA». В первой части лабораторного практикума
рассматривались особенности разработки консольных приложений, в частно-
сти, консольный ввод/вывод, работа с файлами, сетевая организация взаимо-
действий приложений (консольный тип приложения с использованием прото-
колов взаимодействия TCP и UDP). Во второй части лабораторного практикума

Р
излагаются особенности графических возможностей Java, разработки апплетов,
создания графического пользовательского интерфейса (GUI) с использованием

УИ
фреймов и элементов управления. Особое внимаение уделено созданию, орга-
низации работы и синхронизации потоков. Раскрыты основные принципы рабо-
ты с базами данных.
Основной акцент в лабораторном практикуме сделан на разработку при-

БГ
ложений на основе оконного интерфейса. Существуют фундаментальные раз-
личия между консольными приложениями, которые создавались в первой части
лабораторного практикума, и программами Java с оконным интерфейсом. В
а
консольном приложении в качестве интерфейса с пользователем рассматрива-
ется командная строка, через которую определяется последовательность разви-
ек

тия алгоритмов и управление работой программы.


Приложения с оконным интерфейсом или апплеты действуют иначе.
т

Пользователь через графический интерфейс управляет работой программы.


Выбор пунктов меню или кнопок с помощью мыши или клавиатуры вызывает
определенные действия в программе. В любой заданный момент времени име-
ио

ется целый диапазон возможных взаимодействий, каждое из которых будет


приводить к различным программным действиям. Выполнение работ данного
лабораторного практикума имеет своей целью усвоение студентами основных
бл

особенностей и ньюансов разработки приложений с оконным интерфейсом.


Первая лабораторная работа посвящена разработке апплетов. Следующая
Би

работа раскрывает особенности создания потоков. В третьей представлены ос-


новы разработки пользовательского интерфейса с использованием фреймов и
элементов управления. Последняя (четвертая) лабораторная посвящена работе с
базами данных. В конце каждой лабораторной работы содержатся задания для
самостоятельного выполнения студентами.
Коллектив авторов выражает благодарность студентке А. А. Тарасевич за
помощь при составлении лабораторного практикума.

5
ЛАБОРАТОРНАЯ РАБОТА №1

РАЗРАБОТКА АППЛЕТОВ, РАБОТА С ГРАФИКОЙ

Цель: научиться создавать приложения с использованием апплетов.

В лабораторных работах №1–4 ч. 1, изданной в 2007 г., лабораторного прак-


тикума были рассмотрены примеры листинга кода консольных Java-приложений.
Другой тип программ представлен апплетами. Апплеты – это небольшие при-
ложения, которые доступны на Internet-сервере, транспортируются по Internet,
автоматически устанавливаются и выполняются как часть Web-документа. По-

Р
сле того как апплет прибывает к клиенту, он имеет ограниченный доступ к ре-

УИ
сурсам системы, которые использует для создания произвольного мультиме-
дийного интерфейса пользователя и выполнения комплексных вычислений без
риска заражения вирусами или нарушения целостности данных. Работа с ап-
плетами поддерживается пакетом AWT. Этот пакет достаточно большой, что

БГ
позволяет работать не только с апплетами. Пакет AWT содержит многочислен-
ные классы и методы, которые позволяют создавать окна и управлять ими.
Рассмотрим более подробно указанный пакет AWT.
а
Пакет AWT
ек

AWT – Abstract Window Toolkit – абстрактный оконный интерфейс. Ос-


новное назначение пакета AWT: поддержка окон апплета и создание обычных
GUI-приложений. Классы пакета AWT определяют интерфейсные окна и работу
т

с визуальными компонентами окон и содержатся в пакете java.awt.


На рис. 1.1 представлен фрагмент иерархии классов AWT. Практически
ио

все классы пакета AWT являются потомками абстрактного класса Component.

Component
бл

Container TextComponent
Би

MenuContainer
Interface Window Panel

Frame Applet
Рис. 1.1. Фрагмент иерархии классов AWT

6
Рассмотрим особенности программирования апплетов. В последних лабо-
раторных работах рассмотрим более подробно другие классы пакета AWT.

Класс Applet
Для работы с апплетами предназначен класс Applet, который определяет
методы, представленные в табл. 1.1. Applet обеспечивает всю необходимую
поддержку для выполнения апплетов, такую как запуск и остановка. Он также
реализует методы, которые загружают и показывают изображения, и методы,
которые загружают и проигрывают аудиоклипы.
Таблица 1.1

Р
Методы, определенные в классе Applet

УИ
Метод Описание
1 2
void destroy() Освобождает все ресурсы, занятые апплетом. Вызы-
вается браузером непосредственно перед тем, как ап-
плет завершается.
БГ
Метод destroy() вызывается, когда среда решает, что
апплет должен быть полностью удален из памяти. В
а
этот момент следует освободить любые ресурсы, ко-
торые апплет может использовать
ек

String getParame- Возвращает параметр, указанный в paramName. Если


ter(String paramName) указанный параметр не найден, возвращается null
т

(пустой указатель)
void init() Вызывается, когда апплет начинает выполнение. Это
первый метод, который вызывается для любого ап-
ио

плета. В нем необходимо инициализировать пере-


менные. Вызывается этот метод один раз в течение
бл

времени выполнения апплета


boolean isActive() Возвращает true, если апплет был запущен. Возвраща-
ет false, если апплет был остановлен
Би

void resize(Dimension Изменяет размеры апплета согласно измерениям, ука-


dim) занным в dim
void start() Вызывается, чтобы перезапустить апплет после его
остановки. В то время как init() вызывается один раз
(когда апплет загружается), start() запускается каждый
раз, когда HTML-документ апплета отображается на эк-
ране. Так, если пользователь покидает Web-страницу и
возвращается обратно, апплет возобновляет выполне-
ние в start().
7
Окончание табл. 1.1
void stop() Метод stop() вызывается, если Web-браузер покидает
HTML-документ, содержащий апплет, при переходе к
другой странице. Когда вызывается stop(), апплет, ве-
роятно, продолжает выполняться. Следует использо-
вать stop() для приостановки потоков, не требующих
выполнения, если апплет невидим. Их можно переза-
пустить вызывом start(), когда пользователь возвра-
щается к странице.
Метод stop() всегда вызывается перед destroy()

Р
Инициализация и завершение апплета

УИ
Важно понять порядок, в котором вызываются различные методы аппле-
та. Когда апплет начинает выполняться, AWT вызывает методы в такой после-
довательности:

БГ
1) init(); 2) start(); 3) paint();
При завершении апплета имеет место следующая последовательность
вызовов:
1) stop(); 2) destroy();
а
Запуск апплетов
ек

Апплет можно запускать как из HTML-документа, так и из программы


просмотра апплета. Для этого используется тег <applet> языка HTML. Про-
грамма просмотра апплета выполняет каждый <applet>-тeг, который она нахо-
т

дит, в отдельном окне, в то время как Web-браузеры Netscape Navigator, Internet


Explorer и HotJava допускают много апплетов на одной странице.
ио

Покажем синтаксис тега <applet>. Параметры в квадратных скобках не


обязательны.
бл

<applet
[CODEBASE = codebaseURL]
CODE = appletFile
Би

[ALT = altemateText]
[NAME = appletInstanceName]
WIDTH = pixels HEIGHT = pixels
[ALIGN = alignment]
[VSPACE = pixels] [HSPACE = pixels]
>
[< param NAME = AttributeName value = AttributeValue>]
[< param NAME = AttributeName2 value= AttributeValue>]
[HTML Displayed in the absence of Java]
</applet>
8
CODEBASE − необязательный параметр, который определяет базовый URL-
адрес кода апплета. Базовый URL – это каталог, в котором будет разыскиваться
исполняемый файл апплета (имя этого файла указывается параметром CODE).
CODE − обязательный параметр, который задает имя файла, содержащего
откомпилированный файл (с расширением .class) вашего апплета.
WIDTH и HEIGHT − это обязательные параметры, которые задают размер
области показа апплета (в пикселах).
ALIGN − необязательный параметр, который определяет выравнивание
апплета. Возможные значения: left, right, top, bottom, middle, BASELINE,
TEXTTOP, ABSMTODLE И ABSBOTTOM.

Р
<param> (с параметрами NAME= и VALUE=) – тег, позволяющий указы-
вать на HTML-странице параметры, специфические для данного апплета. Ап-

УИ
плет получает доступ к этим параметрам с помощью метода getParameter().
Пример Web-странички, на которой размещен апплет DemoApplet.class:

БГ
Пример 1.1
<html>
<head>
<title> DemoApplet</title>
а
</head>
<applet CODE="DemoApplet.class" WIDTH ="500" HEIGHT="500">
ек

</applet> </html>
Рисование линий в апплете
т

Линии рисуются методом drawLine() формата:


void drawLine (int startX, int startY, int endX, int endY)
Данный метод отображает линию (в текущем цвете рисования), которая
ио

начинается в координатах startX, startY и заканчивается в endX, endY. Пример


использования метода:
бл

Пример 1.2
public void paint(Graphics g) {
Би

g.drawLine(0, 0, 100, 100);


}

Рисование прямоугольников в апплете


Методы drawRect() и fillRect() отображают соответственно рисованный и
заполненный прямоугольник. Их форматы:

void drawRect(int top, int left, int width, int height)


void fillRect(int tоp, int left, int width, int height)

9
Координаты левого верхнего угла прямоугольника задаются в параметрах
top и left, width и height, указывающих размеры прямоугольника (в пикселах).

Пример 1.3
public void paint(Graphics g)
{ g.drawRect(10, 10, 60, 50);
g.fillRect(100, 10, 60, 50);
}

Рисование эллипсов и кругов в апплете

Р
Для рисования эллипса используется drawOval(), а для его заполнения –
fillOval(). Эти методы имеют форматы:

УИ
void drawOval(int top, int left, int width, int height)
void fillOval(int top, int left, int width, int height)

Пример 1.4
public void paint(Graphics g)
{ g.drawOval(10, 10, 50, 50); БГ
а
g.fillOval(100, 10, 75, 50);
}
ек

Рисование дуг в апплете


Дуги можно рисовать методами drawArc() и fillArct(), используя форматы:
т

void drawArc(int top, int left, int width, int height, int начало, int конец)
ио

void fillArc(int top, int left, int width, int height, int начало, int конец)

Дуга ограничена прямоугольником: левый верхний угол прямоугольника


бл

определяется параметрами top, left, а ширина и высота – параметрами width и


height. Дуга рисуется от начала до углового расстояния, указанного в конец.
Углы указываются в градусах и отсчитываются от горизонтальной оси против
Би

часовой стрелки. Дуга рисуется против часовой стрелки, если конец положите-
лен, и по часовой стрелке, если конец отрицателен. Поэтому, чтобы нарисовать
дугу от 12-часового до 6-часового положения, начальный угол должен быть 90°
и угол развертки 180°.

Пример 1.5
public void paint(Graphics g) {
g.drawArc(0, 40, 70, 70, 0, 75);
g. fillArc (0, 40, 70, 70, 0, 75); }
10
Работа с цветом
Работа с цветом поддерживается классом Color. В Color определено не-
сколько цветовых констант (например color.black), специфицирующих ряд
обычных цветов. Возможно также создание собственных цветов с применением
одного из цветовых конструкторов. Обычно используются следующие его фор-
маты:

Color (int red, int green, int blue)


Color (int rgbValue)
Color(float red, float green, float blue)

Р
Пример 1.6

УИ
new Color(255, 100, 100); // светло-красный

По умолчанию графические объекты рисуются в текущем цвете передне-

БГ
го плана. Можно изменить этот цвет, вызывая метод setColor() класса Graphics:

void setColor(Color newColor)// параметр newColor определяет новый


// цвет рисунка.
а
Вызывая метод getColor(), возможно получение текущего цвета:
ек

Color getColor()
т

Следующий пример демонстрирует рисование «Домика» в апплете.


ио

Пример 1.7
Листинг файла DrawHouseApplet.java
бл

import java.awt.*;
import java.applet.*;
public class DrawHouseApplet extends Applet {
Би

//функция прорисовки апплета


public void paint(Graphics g) {
g.setColor(Color.DARK_GRAY);
g.drawLine(50, 150, 200, 50);
g.drawLine(200, 50, 350, 150);
g.drawLine(350, 150, 50, 150);
g.drawLine(50, 150, 200, 50);
g.drawLine(200, 50, 350, 150);
g.drawLine(350, 150, 50, 150);
11
g.drawRect(100, 150, 200, 200);
g.drawLine(50, 150, 200, 50);
g.drawLine(200, 50, 350, 150);
g.drawLine(350, 150, 50, 150);
g.drawRect(100, 150, 200, 200);
g.drawRect(170, 200, 60, 100);
g.drawLine(50, 150, 200, 50);
g.drawLine(200, 50, 350, 150);
g.drawLine(350, 150, 50, 150);
g.drawRect(100, 150, 200, 200);

Р
g.drawRect(170, 200, 60, 100);
g.drawLine(200, 200, 200, 300);

УИ
g.drawLine(170, 250, 230, 250);
g.setColor(Color.MAGENTA);
g.drawString("Домик", 190, 30); }

БГ
}

Откомпилируйте файл DrawHouseApplet.java. Для этого можно использо-


вать команду javac DrawHouseApplet.java. Потом создайте файл, листинг кото-
а
рого приведен ниже. Запустите его с помощью браузера.
Листинг DrawHouseApplet.html
ек

<HTML>
т

<HEAD>
</HEAD>
ио

<BODY BGCOLOR="000000">
<CENTER>
<APPLET code = "DrawHouseApplet.class" width = "500"
бл

height = "300">
</APPLET>
</CENTER>
Би

</BODY>
</HTML>

Результаты работы апплета показаны на рис. 1.2.

12
Р
УИ
Рис. 1.2. Результаты работы апплета DrawHouseApplet

БГ
В программе ниже демонстрируется рисование строк и графических объ-
ектов разными цветами в апплете.
а
Пример 1.8
Листинг AppletSample.java
ек

import java.awt.*;
import java.applet.*;
т

public class AppletSample extends Applet {


int poly_x[]={140,180,180,140,100,100,140};//x-координаты
ио

//для полигона
int poly_y[]={205,225,245,265,245,225,205};//y-координаты
//для полигона
бл

public void paint(Graphics g) {


g.setColor(Color.yellow);//выбрать желтый цвет
g.drawString("Yellow Color", 10, 30 );//нарисовать текст желтым
Би

// цветом
g.drawLine(100, 30, 100, 100);//нарисовать линию
g.drawRect(200, 30, 60, 50);//нарисовать прямоугольник
g.fillRect(200, 30, 60, 50);//нарисовать заполненный прямоугольник
g.setColor(Color.red);//выбрать красный цвет
g.drawString("Red Color", 10, 130 );//нарисовать текст желтым
//цветом
g.drawOval(100, 130, 50, 50); //нарисовать овал
g.fillOval(200, 130, 75, 50);//нарисовать заполненный овал
13
g.drawArc(300, 130, 70, 70, 0, 75);//нарисовать дугу окружности
g.fillArc(400, 130, 70, 70, 0, 75);//нарисовать заполненную дугу
Color c1 = new Color(100, 100, 255);//создать собственный цвет
g.setColor(c1);//выбрать собственный цвет
g.drawString("Own Color", 10, 200 );//нарисовать текст собственным
//цветом
g.drawPolygon(poly_x,poly_y,poly_x.length);//нарисовать многоугольник
}
}
Листинг AppletSample.html

Р
<HTML>
<HEAD>

УИ
</HEAD>
<BODY BGCOLOR="000000">
<CENTER>

БГ
<APPLET
code = "AppletSample.class"
width = "500"
height = "300"
а
>
ек

</APPLET>
</CENTER>
</BODY>
т

</HTML>
Результат работы показан на рис. 1.3.
ио
бл
Би

Рис. 1.3. Результат работы апплета


14
Задания для самостоятельного выполнения

В следующих заданиях выполнить соответствующий рисунок в окне апплета:


1. Создать классы Point и Line. Объявить массив из n объектов класса
Point. Для объекта класса Line определить, какие из объектов Point лежат на
одной стороне от прямой линии и какие − на другой. Реализовать ввод данных
для объекта Line и случайное задание данных для объектов Point.
2. Создать классы Point и Line. Объявить массив из n объектов класса
Point и определить в методе, какая из точек находится дальше всех от прямой
линии, и пометить ее другим цветом.

Р
3. Создать классы Point и Triangle. Объявить массив из n объектов класса
Point. Написать функцию, определяющую какие из точек находятся внутри, а

УИ
какие – снаружи треугольника. Нарисовать их разными цветами.
4. Создать классы Point и Rectangle. Объявить массив из n объектов клас-
са Point. Написать функцию, определяющую какие из точек находятся внутри, а
какие – снаружи прямоугольника. Нарисовать их разными цветами.

БГ
5. Определить класс Line для прямых линий, проходящих через точки
A(x1,y1) и B(x2,y2). Создать массив объектов класса Line. Определить, используя
функции, какие из прямых линий пересекаются, а какие − совпадают. Нарисо-
а
вать все пересекающиеся прямые одним цветом, непересекающиеся − другим.
6. Создать класс Triangle. Определить, какие из m-введенных треуголь-
ек

ников прямоугольные. Нарисовать их другим цветом.


7. Создать класс Triangle. Определить, какие из m-введенных треуголь-
т

ников имеют площадь, больше заданной. Прорисовать их другим цветом.


8. Создать классы Point и Circle. Объявить массив из n объектов класса
Point. Для объекта класса Circle определить, какие из объектов Point лежат
ио

внутри окружности, а какие − вне. Реализовать ввод данных для объекта Circle
и случайное задание данных для объектов Point.
9. Создать свой собственный класс рисования трехмерных прямоуголь-
бл

ников( выпуклых, вогнутых, с заливкой и без нее).


10. Привести графическое доказательство теоремы Пифагора.
Би

11. Создать классы Rectangle и Circle. Объявить массивы из n объектов


класса Circle. Для объекта класса Rectangle определить, какие из объектов Cir-
cle лежат внутри прямоугольника, а какие − вне. Реализовать ввод данных для
объекта Rectangle и случайное задание данных для объектов Circle.
12. Создать классы Line и Circle. Объявить массивы из n объектов класса
Line. Для объекта класса Circle определить, какие из объектов Line пересекают ок-
ружность в двух местах, какие – в одном, и какие вообще не пересекают. Реализо-
вать ввод данных для объекта Circle и случайное задание данных для объектов Line.

15
13. Создать класс HumanFace с различными возможностями: улыбаю-
щийся, печальный, злой, разное положение бровей, губ, волос.
14. Разработать апплет, выполняющий роль справочной таблицы по хи-
мическим элементам, в соответствии с периодической системой Д. И. Менде-
леева.
15. Реализовать визуализацию решения квадратного уравнения. Постро-
ить на экране график квадратичной функции с заданными коэффициентами,
отметить точки пересечения с осью абсцисс, надписать на оси значения корней.

Р
УИ
БГ
а
ек
т
ио
бл
Би

16
ЛАБОРАТОРНАЯ РАБОТА №2

РАЗРАБОТКА АППЛЕТОВ С ИСПОЛЬЗОВАНИЕМ ПОТОКОВ


И ИХ СИНХРОНИЗАЦИИ

Цель: научиться разрабатывать апплеты с использованием потоков.

Многопоточное программирование
В отличие от большинства других машинных языков Java обеспечивает
встроенную поддержку для многопоточного программирования. Многопоточ-

Р
ная программа содержит две и более части, которые могут выполняться одно-
временно, конкурируя друг с другом. Каждая часть такой программы называет-

УИ
ся потоком, а каждый поток определяет отдельный путь выполнения (в после-
довательности операторов программы).
Потоки существуют в нескольких состояниях. Поток может быть в со-

БГ
стоянии выполнения. Может находиться в состоянии готовности к выполне-
нию, как только он получит время CPU. Выполняющийся поток может быть
приостановлен, что временно притормаживает его действие. Затем приостанов-
ленный поток может быть продолжен (возобновлен) с того места, где он был
а
остановлен. Поток может быть блокирован в ожидании ресурса. В любой мо-
мент выполнение потока может быть завершено. После завершения поток не
ек

может быть продолжен.


т

Приоритеты потоков
Java назначает каждому потоку приоритет, который определяет порядок
ио

обработки этого потока относительно других потоков. Приоритеты потоков –


это целые числа, которые определяют относительный приоритет одного потока
над другим. Приоритет потока используется для того чтобы решить, когда пе-
бл

реключаться от одного выполняющегося потока к другому. Это называется пе-


реключением контекста.
Потоку можно назначить приоритет от 1(константа MIN_PRIORITY) до 10
Би

(MAX_PRIORITY) с помощью метода setPriority(), получить значение приорите-


та можно с помощью метода getPriority().
Правила переключения контекста следующие:
• поток может добровольно отказаться от управления;
• поток может быть приостановлен более приоритетным потоком.

Класс Thread. Интерфейс Runnable


Многопоточная система Java построена на классе Thread, его методах и
связанном с ним интерфейсе Runnable. Thread инкапсулирует поток выполне-
17
ния. Так как невозможно непосредственно обращаться к внутреннему состоя-
нию потока выполнения, то взаимодействие с ним осуществляется через его
полномочного представителя – экземпляр (объект) класса Thread, который его
породил. Чтобы создать новый поток, выбранная программа должна будет или
расширять класс Thread, или реализовывать интерфейс Runnable.
Класс Thread определяет несколько методов, которые помогают управ-
лять потоками. В табл. 2.1 содержится описание методов класса Thread.

Таблица 2.1
Некоторые методы класса Thread

Р
Метод Значение

УИ
getName () Получить имя потока
getPriority() Получить приоритет потока
isAlive () Определить, выполняется ли еще поток

БГ
join () Ждать завершения потока
run() Указать точку входа в поток
sleep () Приостановить поток на определенный период времени
start () Запустить поток с помощью вызова метода run ()
а
ек

Создание потоков. Жизненный цикл потока


Программа всегда имеет один поток, который создается при выполнении
программы. В программе этот поток запускается в начале метода main(). В ап-
т

плете браузер является основным потоком. Программа создает поток в допол-


нение к потоку выполнения, который его создает. Для создания дополнительно-
ио

го потока используется объект класса Thread. Каждый дополнительный поток,


который задает программа, представлен объектом класса Thread или подкласса
Thread. Если программа имеет три дополнительных потока, то необходимо соз-
бл

дать три таких объекта.


Для начала выполнения потока вызывается метод start() объекта Thread.
Код, который выполняется в новом потоке, всегда является методом с именем
Би

run(), который является открытым (public), не имеет аргументов и не возвраща-


ет значение. Потоки, отличные от основного потока программы, всегда запус-
каются методом run() объекта, который представляет поток.
При реализации интерфейса Runnable необходимо определить его един-
ственный метод run().
Программа, которая создает три потока, схематически проиллюстрирова-
на на рис. 2.1. Приведенная иллюстрация показывает метод main(), создающий
три потока. Однако необязательно так должно быть всегда. Любой поток может
создавать дополнительные потоки.
18
thread1
Программа run()
main() {
{ //код
//создать поток 1 //потока …
//запустить поток 1 }

//создать поток 2 thread2


//запустить поток 2 run()
thread3 {

Р
//создать поток 3 run() //код
//запустить поток 3 { //потока …

УИ
} //код }
//потока …
}

Синхронизация потоков БГ
Рис. 2.1. Программа, порождающая три потока

Основное различие между потоками и процессами состоит в том, что


а
процессы защищены от воздействия друг на друга средствами операционной
ек

системы (каждый процесс выполняется в своем адресном пространстве). Ис-


пользование потоков, лишенных подобной защиты, позволяет быстро запускать
новые потоки и способствует их производительности. Однако здесь есть и от-
т

рицательный эффект – любой из потоков может получить доступ и даже внести


изменения в данные, которые другой поток считает принадлежащими только
ио

ему. Решение этой проблемы состоит в синхронизации потоков. Ситуация, ко-


гда много потоков, обращающихся к некоторому общему ресурсу, начинают
мешать друг другу, очень часта. Например, когда два потока записывают ин-
бл

формацию в файл/объект/поток. Синхронизация кода реализуется двумя основ-


ными способами.
1. Если критическим участком является метод, то можно просто указать
Би

ключевое слово synchronized в объявлении метода, т.е.

synchronized void myMethod ( ) { … }

Эквивалентный код можно представить в виде

void myMethod ()
{synchronized (this)
{…………….}}
19
2. Если нет доступа к классу, в котором объявлен метод, то для его син-
хронизации можно использовать следующий прием:

synchonized (object)
{ // операторы критического участка, в том числе и вызовы метода}

Здесь object – ссылка на объект, который нужно синхронизировать, т.е. на


объект, элементом которого является вызываемый метод. При синхронизации
одного оператора фигурные скобки можно опускать.
В Java кроме использования блока synchonized разработаны и эффектив-

Р
ные средства межпроцессового взаимодействия. Например, метод

УИ
public final void wait ( ) throws InterruptedException;

осуществляет перевод вызывающего потока в режим ожидания, пока некото-

БГ
рый другой поток не введет notify().
Существуют и другие варианты метода, например:

public final void wait (long timeout ) throws InterruptedException;


а
осуществляет задержку на определенное время.
ек

Метод
т

public final void notify();


ио

«пробуждает» на том же объекте первый поток, который вызвал ожидание –


wait( );
Следующий метод
бл

public final void notifyAll();


Би

пробуждает все потоки, для которых вызван wait( ), и первым будет выполнять-
ся поток с наибольшим приоритетом.
Рассмотрим несколько примеров программ с использованием потоков.
Пример 2.1 является модификацией примера апплета, приведенного в ла-
бораторной работе №1 (см. пример 1.7). Листинг кода ниже демонстрирует, как
можно нарисовать тот же домик с использованием потоков.

20
Пример 2.1
Листинг файла DrawHouseThreadApplet.java

import java.awt.*;
import java.applet.*;

public class DrawHouseThreadApplet extends Applet implements Runnable


{
int level = 0;
Thread t;

Р
//функция инициализации апплета
public void init()

УИ
{
this.setBackground(Color. white);
t = new Thread(this);

БГ
t.start();
}
//функция перерисовки апплета
public void paint(Graphics g)
а
{
ек

g.setColor(Color.DARK_GRAY);
if(level == 1)
{
т

g.drawLine(50, 150, 200, 50);


g.drawLine(200, 50, 350, 150);
ио

g.drawLine(350, 150, 50, 150);


}
if(level == 2)
бл

{
g.drawLine(50, 150, 200, 50);
g.drawLine(200, 50, 350, 150);
Би

g.drawLine(350, 150, 50, 150);


g.drawRect(100, 150, 200, 200);
}
if(level == 3)
{
g.drawLine(50, 150, 200, 50);
g.drawLine(200, 50, 350, 150);
g.drawLine(350, 150, 50, 150);
g.drawRect(100, 150, 200, 200);
21
g.drawRect(170, 200, 60, 100);
}
if(level == 4)
{
g.drawLine(50, 150, 200, 50);
g.drawLine(200, 50, 350, 150);
g.drawLine(350, 150, 50, 150);
g.drawRect(100, 150, 200, 200);
g.drawRect(170, 200, 60, 100);
g.drawLine(200, 200, 200, 300);

Р
g.drawLine(170, 250, 230, 250);
g.setColor(Color.MAGENTA);

УИ
g.drawString("Домик", 190, 30);
}
}

//тело потока
public void run()
{
БГ
а
System.out.println("Run");
ек

while(true)
{
level ++;
т

repaint();
try{
ио

Thread.currentThread().sleep(3000);
}
catch(Exception ex){}
бл

if(level == 4)
{
return;
Би

}
}
}
}

Файл DrawHouseThreadApplet.html

<HTML>
<HEAD>
22
</HEAD>
<BODY bgcolor=white>
<CENTER>
<h1><font color=lightblue> <I>House</I></font></h1>
<APPLET
code = "DrawHouseThreadApplet.class"
width = "400"
height = "400"
>
</APPLET>

Р
</CENTER>
</BODY>

УИ
</HTML>

Следующий пример демонстрирует управление приоритетами.

Пример 2.2
Листинг TryPriorThread.java
БГ
public class TryPriorThread extends Thread{
а
public TryPriorThread(String threadName){
super(threadName);
ек

System.out.println("Thread '"+threadName+"' created!");


}
т

public void run(){


for(int i=0;i<10;i++){
ио

System.out.println("Thread '"+getName()+"' "+i);


try{
sleep(1); //ожидать одну миллисекунду
бл

}
catch(InterruptedException e){
System.out.print("Error:"+e);
Би

}
}
}
public static void main(String [ ] args){
// создать три потока выполнения
Thread min_thr = new TryPriorThread("ThreadMin");
Thread max_thr = new TryPriorThread("ThreadMax");
Thread norm_thr = new TryPriorThread("ThreadNorm");
System.out.println("Starting threads...");
23
min_thr.setPriority(Thread.MIN_PRIORITY); //задать потоку
//минимальный приоритет
//задать потоку максимальный приоритет
max_thr.setPriority(Thread.MAX_PRIORITY);
//задать потоку нормальный приоритет
norm_thr.setPriority(Thread.NORM_PRIORITY);
min_thr.start(); // запустить первый поток
max_thr.start(); // запустить второй поток
norm_thr.start(); // запустить третий поток
}

Р
}

УИ
Результат работы программы:
Thread 'ThreadMin' created!
Thread 'ThreadMax' created!

БГ
Thread 'ThreadNorm' created!
Starting threads...
Thread 'ThreadMax' 0
Thread 'ThreadNorm' 0
а
Thread 'ThreadMin' 0
ек

Thread 'ThreadMax' 1
Thread 'ThreadMax' 2
Thread 'ThreadMax' 3
т

Thread 'ThreadMax' 4
Thread 'ThreadMax' 5
ио

Thread 'ThreadMax' 6
Thread 'ThreadMax' 7
Thread 'ThreadMax' 8
бл

Thread 'ThreadMax' 9
Thread 'ThreadNorm' 1
Thread 'ThreadMin' 1
Би

Thread 'ThreadNorm' 2
Thread 'ThreadMin' 2
Thread 'ThreadNorm' 3
Thread 'ThreadMin' 3
Thread 'ThreadNorm' 4
Thread 'ThreadMin' 4
Thread 'ThreadNorm' 5
Thread 'ThreadMin' 5
Thread 'ThreadNorm' 6
24
Thread 'ThreadMin' 6
Thread 'ThreadNorm' 7
Thread 'ThreadMin' 7
Thread 'ThreadNorm' 8
Thread 'ThreadMin' 8
Thread 'ThreadNorm' 9
Thread 'ThreadMin' 9

Пример, демонстрирующий синхронизацию доступа к файлу.

Р
Пример 2.3
Листинг SynchroThreads.java

УИ
import java.io.*;
public class SynchroThreads{
public static void main(String [ ] args){

БГ
SynchroFile sf= new SynchroFile(); //объект класса SynchroFile
FileThread ft1=new FileThread("FisrtThread",sf); //первый поток
FileThread ft2=new FileThread("SecondThread",sf); //второй поток
ft1.start(); //стартовать первый поток
а
ft2.start(); //стартовать второй поток
ек

}
}
class FileThread extends Thread{
т

String str;
SynchroFile sf;
ио

public FileThread(String str,SynchroFile sf){


this.str=str;
this.sf=sf;
бл

}
public void run(){
for(int i=0;i<10;i++){
Би

sf.writing(str,i);
}
}
}
class SynchroFile{
File f=new File("file.txt");
public SynchroFile(){
System.out.println("Object SynchroFile creating...");
try{
25
f.delete(); //удалить файл, если он есть
f.createNewFile(); //создать новый файл
}
catch(IOException ioe){
ioe.printStackTrace();
}
}
public synchronized void writing(String str,int i){
try{
RandomAccessFile raf=new RandomAccessFile(f,"rw");

Р
raf.seek(raf.length()); //переместить указатель в конец
System.out.print(str);

УИ
raf.writeBytes(str); //записать в файл
// на случайное значение приостанавить поток
Thread.sleep((long)(Math.random()*15));

БГ
raf.seek(raf.length()); //переместить указатель в конец
System.out.print("->"+i+" \n");
raf.writeBytes("->"+i+" \n"); //записать в файл
}
а
catch(IOException ioe){
ек

ioe.printStackTrace();
}
catch(InterruptedException ie){
т

ie.printStackTrace();
}
ио

notify(); //известить об окончании работы с методом


}
}
бл

Работа программы будет выглядеть на экране следующим образом:


Object SynchroFile creating...
Би

FisrtThread->0
SecondThread->0
FisrtThread->1
SecondThread->1
FisrtThread->2
SecondThread->2
FisrtThread->3
SecondThread->3
FisrtThread->4
26
SecondThread->4
FisrtThread->5
SecondThread->5
FisrtThread->6
SecondThread->6
FisrtThread->7
SecondThread->7
FisrtThread->8
SecondThread->8
FisrtThread->9

Р
SecondThread->9

УИ
В каталоге приложения будет создан файл file.txt, дублирующий инфор-
мацию, выведенную на экран.
Следующий пример демонстрирует применение потоков в апплете. Соз-

БГ
дается апплет, в разных потоках осуществляется движение строки, квадрата и
овала, а также зарисовка фона апплета.

Пример 2.4
а
Листинг AppletThreadSample.java
ек

import java.awt.*;
import java.applet.*;
//класс апплета, который реализует интерфейс Runnable
т

public class AppletThreadSample extends Applet implements Runnable{


private Thread T; //создать объект потока
ио

//объявление переменных
private ShapeString m_ShapeString = null; //для строки
private ShapeOval m_ShapeOval = null; //для овала
бл

private ShapeRect m_ShapeRect = null; //для квадрата


public void run() { //реализация метода run, точка входа в поток
setBackground(Color.yellow); //фон апплета зарисовывается желтым
Би

while (true){ //бесконечный цикл


repaint(); //перерисовка апплета или вызов метода paint
try{
T.sleep(10); //приостановка апплета на 10 миллисекунд
}
catch (InterruptedException e){ }
}
}
public void init() { //метод инициализации апплета
27
T = new Thread(this); //создание потока и привязка его к текущему классу
T.start(); //запуск потока (вызывается run)
//создание объектов
m_ShapeString= new ShapeString();
m_ShapeOval= new ShapeOval();
m_ShapeRect= new ShapeRect();
}
public void paint(Graphics g) { //метод прорисовки апплета
//прорисовка строки
g.drawString("This is ShapeString",

Р
m_ShapeString.x_String,m_ShapeString.y_String);
//прорисовка квадрата

УИ
g.setColor(Color.red);
g.drawRect(m_ShapeRect.x_Rect,m_ShapeRect.y_Rect,
m_ShapeRect.w_Rect,m_ShapeRect.h_Rect);

БГ
//прорисовка овала
g.setColor(Color.CYAN);
g.fillOval(m_ShapeOval.x_Oval,m_ShapeOval.y_Oval,
m_ShapeOval.w_Oval,m_ShapeOval.h_Oval);
а
}
//класс ShapeString, реализующий интерфейс Runnable
ек

class ShapeString implements Runnable{


Thread T;
т

int x_String, y_String; //координаты строки


public ShapeString(){ //конструктор
ио

T = new Thread(this); //создание объекта Thread


//установление начальных координат строки
x_String=100; y_String=100;
бл

T.start(); //запуск потока (вызов метода run)


}
public void run(){ //метод run
Би

for(;;){
x_String+=15; //изменение координаты строки
try{
T.sleep(1000); //приостановка работы потока на 1000 миллисекунд
}
catch (InterruptedException e){}
}
}
}
28
//класс ShapeRect реализующий интерфейс Runnable
class ShapeRect implements Runnable{
Thread T;
int x_Rect,y_Rect,w_Rect,h_Rect; //координаты и размеры квадрата
public ShapeRect(){ //конструктор
T = new Thread(this); //создание объекта Thread
//установление начальных координат квадрата
x_Rect=350;y_Rect=50;w_Rect=100;h_Rect=100;
T.start();//запуск потока (вызов метода run)
}

Р
public void run(){ //метод run
for(;;){

УИ
x_Rect-=15; //изменение координаты квадрата
try{
T.sleep(500); //приостановка работы потока на 1000 миллисекунд

БГ
}
catch (InterruptedException e){}
}
}
а
}
//класс ShapeOval реализующий интерфейс Runnable
ек

class ShapeOval implements Runnable{


Thread T;
т

int x_Oval, y_Oval,w_Oval,h_Oval; //координаты и размеры овала


public ShapeOval(){ //конструктор
ио

T = new Thread(this); //создание объекта Thread


//установление начальных координат овала
x_Oval=30; y_Oval=30;w_Oval=100;h_Oval=90;
бл

T.start(); //запуск потока (вызов метода run)


}
public void run(){//метод run
Би

for(;;){//изменение координат овала


x_Oval+=8;
y_Oval+=7;
try{
T.sleep(100); //приостановка работы потока на 100 миллисекунд
}
catch (InterruptedException e){ }
} } } }
Откомпилируйте программу. Не забудьте создать соответствующий
29
html-файл. Результат работы программы показан на рис. 2.2.

Направление
Направление движения
движения квадрата
строки

Р
УИ
Направление
движения
овала

БГ
Рис. 2.2. Результат работы программы AppletThreadSample.java
а
ек

Задания для самостоятельного выполнения

1. Составить программу вывода на экран дисплея схематичного изобра-


т

жения велосипедиста. При запуске программы велосипедист начинает движе-


ние, вращая ногами педали велосипеда.
ио

2. Составить программу вывода на экран дисплея схематичного изобра-


жения человека. При запуске программы человек начинает идти, размахивая в
такт движения руками.
бл

3. Составить программу вывода в верхней части экрана дисплея изобра-


жения облака. При запуске программы облако начинает двигаться, и из него
начинает идти дождь. При этом размер облака постепенно уменьшается.
Би

4. Составить программу вывода в верхнюю часть экрана дисплея изо-


бражения тучи, а в нижнюю часть экрана дисплея – емкость для воды. При за-
пуске программы начинает идти дождь. При этом размер тучи уменьшается, a
емкость наполняется водой.
5. Составить программу вывода в верхнюю часть экрана дисплея изо-
бражения тучи, а в нижнюю часть экрана дисплея – сугроб. При запуске про-
граммы начинает идти снег. При этом размер тучи уменьшается, a сугроб рас-
тет.

30
6. Составить программу вывода на экран дисплея изображения летящего
самолета.
7. Составить программу вывода на экран дисплея изображения пушки. В
правой части экрана появляется и исчезает случайным образом мишень. Нажа-
тием кнопки производится выстрел из пушки. Момент попадания фиксируется
в виде взрыва.
8. Составить программу вывода в верхней части экрана дисплея движу-
щегося слева направо парусника с постоянной скоростью. Ее значение всякий
раз задается генератором случайных чисел. В нижней части экрана дисплея
расположена пушка. При нажатии кнопки происходит выстрел торпедой с по-

Р
стоянной скоростью. При попадании торпеды в пушку смоделировать взрыв
парусника и его исчезновение. При промахе парусник достигает правой грани-

УИ
цы экрана дисплея и начинает движение сначала с новой постоянной скоро-
стью.
9. Составить программу вывода на экран дисплея схематичного изобра-

БГ
жения лыжника. При нажатии кнопки он начинает движение классическим
стилем.
10. Составить программу вывода на экран дисплея схематичного челове-
ка в положении готовности осуществить прыжок в длину. При нажатии кнопки
а
спортсмен начинает разбег и выполняет такой прыжок.
11. Составить программу вывода изображения циферблата механических
ек

часов с секундной, минутной и часовой стрелками. Организовать срабатывание


будильника в заданное время.
т

12. Составить программу вывода на экран дисплея песочных часов. При


нажатии кнопки моделируется процесс падения песчинок, уменьшение уровня
ио

песка в верхней части колбы и увеличение в нижней части колбы.


13. Составить программу вывода на экран дисплея треугольника. При
нажатии клавиши «курсор вправо» треугольник вращается по часовой стрелке,
бл

клавиши «курсор влево» − против часовой стрелки.


14. Составить программу вывода на экран дисплея схематичного изобра-
жения бабочки. При нажатии кнопки бабочка начинает полет, взмахивая
Би

крыльями.
15. Составить программу вывода на экран дисплея трех вложенных друг
в друга окружностей, представляющих собой беговые дорожки. На линию стар-
та выходят три спортсмена (произвольные фигуры). При нажатии кнопки уча-
стники стартуют с одинаковой угловой скоростью. После старта угловые ско-
рости участников забега изменяются по случайному закону. На финише указать
место, занятое каждым участником забега.

31
ЛАБОРАТОРНАЯ РАБОТА №3

РАЗРАБОТКА ПОЛЬЗОВАТЕЛЬСКОГО ИНТЕРФЕЙСА


С ИСПОЛЬЗОВАНИЕМ ФРЕЙМОВ, ЭЛЕМЕНТОВ УПРАВЛЕНИЯ

Цель: научиться создавать простейшие GUI-приложения.

События
В основу Java-программирования наряду с другими положен механизм
обработки событий.

Р
Событие – это объект, который описывает изменение состояния источни-
ка (нажатие кнопки, выбор пункта меню, разворачивание, сворачивание окош-

УИ
ка, нажатие клавиши и т.д.). Источник – это объект, генерирующий события.
Одно и то же событие может быть значимым для одних объектов и несущест-
венным для других.

БГ
В Java различают два механизма обработки событий:
1) с помощью метода handleEvent() (применялся до версии jdk 1.1 (Java
1.0));
2) с помощью модели делегирования событий.
а
Далее будем рассматривать особенности обработки событий с примене-
нием второго механизма. В соответствии с моделью делегирования событий в
ек

обработке событий участвуют 2 объекта: источник (source) и блок прослушива-


ния (listener − интерфейс для перехода конкретного вида события от конкретно-
т

го компонента). Источник − объект, генерирующий событие. Блок прослуши-


вания – объект, получающий уведомление о возникновении события, зарегист-
ио

рированного одним или несколькими источниками, путем вызова одного из его


методов (методов блока прослушивания) для приема и обработки этих уведом-
лений.
бл

Методы обработки событий находятся в пакете java.awt.event.

Классы событий
Би

В корне иерархии классов событий Java находится класс EventObject, на-


ходящийся в пакете java.util. Класс EventObject содержит 2 метода:
• Object getSource( ) – возвращает источник события;
• toString( ) – возвращает название этого события в виде строки.
В Java определены несколько типов событий (табл. 3.1).

32
Таблица 3.1
Классы событий
Класс событий Описание
ActionEvent Генерируется, когда нажата кнопка, дважды
щелкнут элемент списка или выбран пункт меню
AdjustmentEvent Генерируется при манипуляциях с полосой про-
крутки
ComponentEvent Генерируется, когда компонент скрыт, переме-
щен, изменен в размере или становится види-
мым

Р
ContainerEvent Генерируется, когда компонент добавлен или
удален из контейнера

УИ
FocusEvent Генерируется, когда компонент получает или те-
ряет фокус
ItemEvent Генерируется, когда помечен флажок или эле-

БГ
мент списка, сделан выбор элемента в списке,
выбран или отменен элемент меню с меткой
KeyEvent Генерируется, когда получен ввод с клавиатуры
MouseEvent Генерируется, когда объект перетащен мышью
а
(dragged), перемещен (moved), произошел щел-
ек

чок (clicked), нажата (pressed) или отпущена (re-


leased) кнопка мыши, указатель мыши входит
или выходит в/за границы компонента
т

TextEvent Генерируется, когда изменено значение тексто-


вого поля
ио

WindowEvent Генерируется, когда окно активизировано, за-


крыто, развернуто, свернуто и т.п.
бл

Класс ActionEvent
Определяет четыре целочисленные константы, которые можно использо-
вать для идентификации любых модификаторов, связанных с событием дейст-
Би

вия: ALT_MASK, CTRL_MASK, META_MASK и SHIFT_MASK. Кроме того, суще-


ствует целочисленная константа ACTION_PERFORMED, которую можно при-
менять для идентификации action-события.
Имеет два конструктора:

ActionEvent ( Object src, int type, String cmd );


ActionEvent ( Object src, int type, String cmd, int modifiers );

33
src – ссылка на объект, который генерирует события (для следующих
описываемых классов значение аналогичное);
type – тип события (для следующих описываемых классов значение ана-
логичное);
cmd – командная строка события;
modifiers – указывает, какие клавиши-модификаторы были нажаты при
генерации события (Alt, Ctrl, Shift ).
Например, когда кнопка нажата, генерируется action-событие, которое
имеет имя команды, равное метке или надписи на этой кнопке.

Р
FocusEvent
Событие этого класса идентифицируется константой FOCUS_GAINED и

УИ
FOCUS_LOST. Конструкторы класса:

FocusEvent ( Component src, int type );

БГ
FocusEvent ( Component src, int type, boolean temporaryFlag );
temporaryFlag – устанавливается как true, если cобытие фокуса времен-
ное, иначе – false.
а
ItemEvent
Существует два типа Item-событий, которые определяются константами:
ек

DESELECTED – пользователь отменил выбор элемента;


т

SELECTED – выбрал элемент списка.


ио

Конструктор класса:

ItemEvent ( ItemSelectable src, int type, Object entry, int state );


бл

entry – передает конструктору элемент, который генерировал Item-


событие ;
state – состояние этого элемента.
Би

Для того чтобы получить ссылку на объект ItemSelectable, используется


метод getItemSelectable( ).

KeyEvent
Имеется три типа Key-событий, которые идентифицируются тремя
константами:
KEY_PRESSED – клавиша нажата;
KEY_RELEASED – клавиша отпущена;
34
KEY_TYPED – генерируется только при нажатии символьной клавиши.

Конструктор класса:

KeyEvent ( Component src, int type, long when, int modifiers, int code);
when – параметр, передающий конструктору системное время, когда была
нажата клавиша (для следующего вписываемого класса значение аналогичное);
modifiers – параметр, указывающий, какие модификаторы были нажаты
вместе с клавишей;
code – параметр, передающий конструктору код клавиши.

Р
MouseEvent

УИ
Существует семь типов Mouse-событий, которые идентифицируются се-
мью константами:

БГ
MOUSE_CLICKED – пользователь щелкнул кнопкой мыши;
MOUSE_DRAGGED – пользователь перетащил мышь;
MOUSE_ENTERED – указатель мыши введен в компонент;
MOUSE_EXITED – указатель мыши выведен из компонента;
а
MOUSE_MOVED – мышь передвинута;
MOUSE_PRESSED – кнопка мыши нажата;
ек

MOUSE_RELEASED – кнопка мыши освобождена.


т

Конструктор класса:
ио

MouseEvent (Component src, int type, long when, int modifiers, int x, int y, int
clicks, boolean triggersPopup );
x, y – координаты мыши;
бл

clicks – подсчитывается количество щелчков;


triggersPopup – показывает, приводит ли это событие к появлению рас-
крывающегося меню; если да, то значение параметра соответствует true.
Би

int getX( ); int getY( ); − методы для получения координат мыши.

TextEvent
TEXT_VALUE_CHANGED – событие, определяющее ввод текста пользо-
вателем в текстовое поле.

Конструктор класса:

TextEvent (Object src, int type);


35
WindowEvent
Существует семь типов событий WindowEvent:

WINDOW_ACTIVATED – окно активизировано;


WINDOW_CLOSED – окно закрыто;
WINDOW_DEACTIVATED – окно деактивизировано;
WINDOW_DEICONIFIED – окно развернуто из пиктограммы;
WINDOW_ICONIFIED – окно свернуто в пиктограмму;
WINDOW_OPENED – окно открыто;
WINDOW_CLOSING – пользователь потребовал закрытия окна.

Р
Конструктор класса:

УИ
WindowEvent (Window src, int type);
Метод Window getWindow() возвращает Window-объект, который сгенери-

БГ
ровал это событие.

Элементы-источники событий
В табл. 3.2 приведены некоторые элементы-источники событий, приме-
а
няемые в Java, и их описание.
Таблица 3.2
ек

Элементы-источники событий
Источник событий Описание
т

1 2
Button (кнопка) Генерирует action-события в тот момент, когда
ио

нажимается кнопка
Checkbox (флажок) Генерирует item-события, когда флажок устанав-
ливается/сбрасывается
бл

Choice (список с выбором) Генерирует item-события, когда изменяется выбор


элемента в списке с выбором
List (список) Генерирует action-события, когда на элементе
Би

списка выполнен двойной щелчок (мышью). Гене-


рирует item-события, когда элемент выделяется
или снимается выделение
MenuItem (пункт меню) Генерирует action-события, когда пункт меню вы-
делен. Генерирует события элемента, когда пункт
меню с меткой выделен или выделение отменяется
Scrollbar (полоса про- Генерирует adjustment-события при манипуляциях
крутки) с полосой прокрутки

36
Окончание табл. 3.2
1 2
TextField и TextArea Генерирует text-события, когда пользователь вводит
(текстовое поле и тек- символ
стовая область)
Window (окно) Генерирует window-события, когда окно активизи-
руется, закрывается, деактивизируется, сворачивает-
ся в пиктограмму, разворачивается из пиктограммы,
открывается или выполняется выход из него (quit)

Р
Интерфейсы прослушивания событий
Модель делегирования событий содержит две части: источник событий и

УИ
блоки прослушивания событий. Блоки прослушивания событий создаются пу-
тем реализации одного или нескольких интерфейсов прослушивания событий.
Эти интерфейсы определены в пакете java.awt.event. Когда событие происхо-

БГ
дит, источник события вызывает соответствующий метод, определенный бло-
ком прослушивания, и передает ему объект события в качестве параметра.
В табл. 3.3 приведены интерфейсы прослушивания событий и их методы.
Когда класс реализует какой-нибудь из этих интерфейсов, то все методы ин-
а
терфейса должны быть реализованы в этом классе. В случае, если среди мето-
ек

дов интерфейса вам необходимы не все, а только некоторые из них, то для ос-
тальных методов в качестве реализации следует оставить пустые скобки {}.
т

Таблица 3.3
Интерфейсы прослушивания событий
ио

Интерфейс Определяемые методы


1 2
ActionListener Определяет один метод для приема action-событий:
бл

void actionPerformed(ActionEvent ae)


AdjustmentListener Определяет один метод для приема adjustment-
событий:
Би

void adjustmentValueChanged(AdjustmentEvent ae)


FocusListener Определяет два метода для приема focus-событий
void focusGained(FocusEvent fe)
void focusLost(FocusEvent fe)
ItemListener Определяет один метод, распознающий события
изменения состояние элемента
void itemStateChanged(ItemEvent ie)

37
Окончание табл. 3.3
1 2
KeyListener Определяет три метода, распознающих события
клавиатуры
void keyPressed(KeyEvent ke)
void keyReleased(KeyEvent ke)
void keyTyped(KeyEvent ke)
MouseListener Определяет пять методов, распознающих события
щелчка, входа в границы компонента, выхода из
границ, нажатия, отпускания клавиши мыши

Р
void mouseClicked(MouseEvent me)

УИ
void mouseEntered(MouseEvent me)
void mouseExited(MouseEvent me)
void mousePressed(MouseEvent me)
void mouseReleased(MouseEvent me)

БГ
MouseMotionListener Определяет два метода, распознающих события пе-
ретаскивания перемещения мыши
void mouseDragged(MouseEvent me)
void mouseMoved(MouseEvent me)
а
TextListener Определяет один метод, связанный с событием из-
ек

менения текстового значения


void textChanged(TextEvent te)
WindowListener Определяет семь методов, связанных с окошком –
т

событиями активации и т.д.


void windowActivated(WindowEvent we)
ио

void windowClosed(WindowEvent we)


void windowClosing(WindowEvent we)
void windowDeactivated(WindowEvent we)
бл

void windowDeiconified(WindowEvent we)


void windowIconified(WindowEvent we)
void windowOpened(WindowEvent we)
Би

Классы пакета AWT Component, Window, Frame


Класс Component
Абстрактный класс, инкапсулирующий все элементы визуального интер-
фейса пользователя. Все управляющие компоненты окна пользователя являют-
ся подклассами класса Component. В данном классе определено более 100 ме-
тодов, которые отвечают за управление событиями, позиционирование, управ-
ление размерами, управление цветами, перерисовку.

38
Класс Window
Создает окно верхнего уровня на рабочем столе. Он расширяется классом
Frame, который и представляет интерфейсное окно, окно с меню, обрамлением,
необходимое для создания графического приложения с его компонентами.

Класс Frame
Инкапсулирует полноценное окно, имеющее строку заголовка, строку
меню, обрамление и углы, изменяющие размеры окна.
Для создания окна Frame существуют два конструктора:

Р
Frame ();

УИ
Frame ( String Zagolovok);

Для установления размера фрейма существуют следующие методы:

void setSize ( int Width, int Height );


void setSize ( Dimension size ); БГ
а
Dimension – класс, содержащий поля width и height.
Метод, позволяющий сделать окно видимым:
ек

void setVisible ( boolean visibleFlag );


т

Пример кода для создания фреймового окна показан ниже.


ио

Пример 3.1
import java.awt.*;
бл

public class NewFrame extends Frame


{
TextArea ta;
Би

public NewFrame ( String title )


{
super ( title );
setSize(300,200);
//…
}
public static void main ( String args [ ] )
{
NewFrame nf = new NewFrame (“Мой фрейм”);
39
nf.show ( );
}
}

Некоторые методы класса Frame:


String getTitle( ); – получить заголовок окна;
void setTitle (String); – установить заголовок окна;
void setResizable (boolean); – разрешить изменение размеров окна;
boolean isResizable(); – возвратить true, если размер окна можно изменять,
иначе false.

Р
Элементы управления Label, Button, Checkbox, Choice, List, Scrollbar

УИ
Элемент управления – это компоненты, которые предоставляют пользова-
телю различные способы взаимодействия с приложением (например кнопки,
флажки, полосы прокрутки и т.п.)

БГ
Элементы управления представлены следующими классами:
Label – с помощью класса Label можно создавать текстовые строки в окне
Java-программ. По умолчанию текст будет выровнен влево, но, используя методы
а
setAligment (Label.CENTER );
ек

setAligment (Label.RIGHT );

строку можно выровнять по центру и по правому краю. Можно создавать


т

выводимый текст либо при создании объекта класса Label, либо создать пустой
объект и уже затем определить его текст вызовом метода setText( ).
ио

Для этого класса существуют три конструктора, использование которых


показано ниже:
бл

Label first = new Label ( );


Label second = new Label (“some text”);
Label third = new Label (“some text”, Label.CENTER);
Би

Button – представляет на экране кнопку. Имеет два конструктора, исполь-


зование которых показано ниже:

Button first = new Button ( );


Button second = new Button (“some text”);

Сделать кнопку неактивной можно методом void disable( ).


Следующий пример демонстрирует обработку кнопки.
40
Пример 3.2
Листинг ButtonDemo.java
import java.awt.*;
import java.awt.event.*;
public class ButtonDemo extends Frame
implements ActionListener,WindowListener{
Button btn;
Label lb;
int count;
public ButtonDemo(){

Р
super("Фреймовое окно с кнопкой");
setLayout(new FlowLayout(FlowLayout.LEFT));

УИ
btn=new Button("Нажмите кнопку");
setSize(300,200);
btn.addActionListener(this);

БГ
lb=new Label("Здесь текстовое поле");
count=0;
add(btn);
add(lb);
а
setVisible(true);
ек

addWindowListener(this);
}
public void actionPerformed(ActionEvent ae) {
т

count++;
lb.setText("Кнопка нажата "+count+" раз");
ио

}
public void windowClosing(WindowEvent we){
this.dispose();
бл

}
public void windowActivated(WindowEvent we){};
public void windowClosed(WindowEvent we){};
Би

public void windowDeactivated(WindowEvent we){};


public void windowDeiconified(WindowEvent we){};
public void windowIconified(WindowEvent we){};
public void windowOpened(WindowEvent we){};

public static void main(String args[])


{ButtonDemo bd=new ButtonDemo();
}
}
41
Checkbox – отвечает за создание и отображение кнопок с независимой
фиксацией. Эти кнопки имеют два состояния: включено и выключено. Щелчок
по такой кнопке приводит к тому, что ее состояние меняется на противополож-
ное. Если разместить несколько кнопок с независимой фиксаций внутри эле-
мента класса CheckboxGroup, то вместо них мы получаем кнопки с зависимой
фиксацией. Для такой группы кнопок характерно то, что в один и тот же момент
может быть включена только одна кнопка. Если нажать какую-либо кнопку из
группы, то ранее нажатая кнопка будет отпущена.
Choice – создает раскрывающийся список.

Р
Пример реализации списка из трех пунктов.

УИ
Пример 3.3
Choice choice = new Choice ( );
choice.addItem (“First”);

БГ
choice.addItem (“Second”);
choice.addItem (“Third”);

Методы класса Choice:


а
int countItems( ) – считать количество пунктов в списке;
String getItem(int) – возвратить строку с определенным номером в списке;
ек

void select(int) – выбрать строку с определенным номером.


т

List – по назначению похож на Choice, но предоставляет пользователю не


раскрывающийся список, а окно с полосами прокрутки. Такое окно содержит
ио

пункты выбора.
Создать объект класса List можно двумя способами:
1. Создать пустой список и добавить в него пункты методом addItem().
бл

При этом размер списка будет расти при добавлении пунктов.

Пример 3.4
Би

List list1 = new List ( );


list1.addItem (“1”);
list1.addItem (“2”);
list1.addItem (“3”);

2. Создать пустой список, добавить пункты при помощи addItem ( ), при


этом можно ограничить количество видимых в окне списка пунктов. Ниже по-
казан пример, демонстрирующий список, в котором видно 2 элемента.

42
Пример 3.5
List list2 = new List (2, true );
list2.addItem (“1”);
list2.addItem (“2”);
list2.addItem (“3”);
Некоторые полезные методы класса List:
String getItem(int) – получить текст пункта с номером int;
int countItems( ) – посчитать количество пунктов в списке;
void clear( ) – очистить список;
void delItem(int) – удалить из списка пункт с номером int;

Р
void delItems(int, int) – удалить из списка элементы с int по int;
int getSelectedIndex( ) – получить порядковый номер выделенного элемен-

УИ
та списка;
void select(int) – выделить элемент списка с определенным номером.

БГ
Следующий пример демонстрирует обработку списка, раскрывающегося
списка и кнопки с независимой фиксацией.

Пример 3.6
а
Листинг ListDemo.java
ек

import java.awt.*;
import java.awt.event.*;
public class ListDemo extends Frame implements ItemListener{
т

List lst;Checkbox chb;Choice ch;


public ListDemo(){
ио

super("Фреймовое окно");
setLayout(new FlowLayout(FlowLayout.CENTER));
setSize(300,200);
бл

lst = new List (2, false );


lst.addItem ("1 BSUIR");
lst.addItem ("2 BSEU");
Би

lst.addItem ("3 BSU");


chb=new Checkbox("Кнопка с независимой фиксацией");
ch=new Choice();
ch.add("Сюда переносятся строки со списка");
add(lst);
add(ch);
add(chb);
setVisible(true);
lst.addItemListener(this);
43
}
public void itemStateChanged(ItemEvent ie){
ch.addItem(lst.getSelectedItem());
}
public static void main(String args[]){
ListDemo list=new ListDemo();
}
}

Scrollbar – определяет полосу прокрутки. Создать полосу прокрутки

Р
можно следующим образом:
new Scrollbar ( );

УИ
new Scrollbar ( Scrollbar.VERTICAL );
new Scrollbar ( <ориентация>, <текущее значение>, <видно>, <минималь-
ное значение>, <максимальное значение>);

БГ
<ориентация> – ориентация полосы, которая задается константами Scroll-
bar.HORIZONTAL, Scrollbar.VERTICAL.
<текущее значение> – начальное значение, в которое помещается бегунок
полосы прокрутки;
а
<видно> – сколько пикселов прокручиваемой области видно и на сколько
пикселов эта область будет прокручена при щелчке мышью на полосе прокрутки;
ек

<минимальное значение> – минимальное значение полосы прокрутки;


<максимальное значение> – максимальное значение полосы прокрутки.
т

Элементы управления TextField и TextArea


ио

Эти два класса позволяют отображать текст с возможностью его выделе-


ния и редактирования. Это по сути маленькие текстовые редакторы – одно-
строчный (TextField) и многострочный (TextArea).
бл

Создать текстовое поле и текстовую область можно следующими спо-


собами:
TextField tf = new TextField (50);
Би

TextArea ta = new TextArea (5, 30);

Чтобы запретить или разрешить редактирование текста в окне, можно


воспользоваться методом void setEditable(boolean).
tf.setEditable (false);
ta.setEditable (false);

Некоторые методы классов TextField и TextArea:


String getText( ) – читать текст;
44
void setText(String) – отобразить текст;
void selectAll( ) – выделить весь текст;
int getColumns( ) – возвратить количество символов строки.

Специфические методы TextField:


void setEchoChar(char) – установить символ маски (при вводе паролей);
char getEchoChar( ) − узнать символ маски.
Специфические методы для TextArea:
int getRows( ) – считать количество строк в окне;
void insertText(String, int) – вставить текст в определенной позиции int;

Р
void replaceText(String, int, int) – заменить текст между заданными на-
чальной и конечной позициями.

УИ
Следующий пример демонстрирует приложение с элементами управле-
ния: кнопкой (Button), списком (List), раскрывающимся списком(Choice), тек-
стовой строкой (Label), текстовым полем (TextField). Введенное в текстовом

БГ
поле слово при нажатии кнопки добавляется как в список, так и в раскрываю-
щийся список. Также реализован механизм закрытия фрейма.

Пример 3.7
а
Листинг GUISample.java
import java.io.*; //импортирование пакета ввода-вывода
ек

import java.awt.*; //импортирование пакета awt


import java.awt.event.*; //импортирование пакета поддержки событий
т

public class GUISample extends Frame{ //объявление класса GUISample


Button b1 = new Button("Add"); //создание кнопки с надписью "Add"
ио

Choice ch1=new Choice(); //создание раскрывающегося списка


TextField tf1 = new TextField(); //создание текстового поля (строки
//ввода)
бл

Label label1 = new Label("Enter your text here:"); //создание текстовой


//строки
List l1 = new List(); //создание списка
Би

public GUISample(){ //объявление конструктора класса


setLayout(null); //отключение менеджера компоновки
setSize(600,400); //установка размеров фрейма
setTitle("This is my Frame"); //установка заголовка фрейма
setBackground(Color.cyan); //установка цвета заднего фона фрейма
add(b1); //добавление кнопки к окну
b1.setBounds(220,200,84,24); //установка размеров кнопки
b1.setForeground(Color.black); //установка цвета переднего фона кнопки
b1.setBackground(Color.magenta); //установка цвета заднего фона кнопки
45
add(ch1); //добавление раскрывающегося списка к окну
ch1.setBounds(50,120,120,20); //установка размеров раскрывающегося
//списка
add(tf1); //добавление текстового поля к окну
tf1.setBounds(200,80,120,20); //установка размеров текстового поля
add(label1); //добавление текстовой строки к окну
label1.setBounds(200,55,120,20); //установка размеров текстовой строки
add(l1); //добавление списка к окну
l1.setBackground(Color.white); //установка цвета заднего фона списка
l1.setBounds(350,120,200,216); //установка размеров списка

Р
/*регистрация блока прослушивания событий типа WindowEvent*/
addWindowListener(new WindowClose());

УИ
/*регистрация блока прослушивания событий типа ActionEvent*/
b1.addActionListener(new ButtonAdd());
}

БГ
/*объявление класса-адаптера для обработки Window-событий*/
class WindowClose extends WindowAdapter {
/*метод, который вызывается при закрытии окна*/
public void windowClosing(WindowEvent we) {
а
setVisible(false); //фрейм-окно становится невидимым
ек

}
}
/*объявление класса для обработки Action-событий (класс ButtonAdd реа-
т

лизует интерфейс ActionListener)*/


class ButtonAdd implements ActionListener {
ио

/*реализация метода, который вызывается при наступлении action-


события*/
public void actionPerformed(ActionEvent event) {
бл

/*добавление текста из текстового поля в раскрывающийся список*/


ch1.add(tf1.getText());
/*добавление текста из текстового поля в список*/
Би

l1.add(tf1.getText(),2);
}
}
static public void main(String args[]){ //объявление метода main()
GUISample MyFrame=new GUISample(); //создание экземпляра класса
//GUISample
MyFrame.setVisible(true); //выведение окна на экран дисплея
}}

46
Результаты работы программы представлены на рис. 3.1.

Текстовая строка
Список

Текстовое поле

Р
Раскрывающийся

УИ
список Кнопка

БГ
Рис. 3.1. Результат работы программы
а
Диалоговые окна
ек

Диалоговые окна подобны фрейм-окнам, за исключением того, что они –


всегда дочерние окна для окна верхнего уровня. Кроме того, диалоговые окна
не имеют строки меню. В других отношениях они функционируют подобно
т

фреймовым окнам. Можно, например, добавить к ним элементы управления


тем же способом, каким добавляются элементы управления к фреймовому окну.
ио

Диалоговые окна могут быть модальными или немодальными. Когда модальное


диалоговое окно активно, весь ввод направляется к нему, пока оно не будет за-
крыто. Это означает, что невозможно обратиться к другим частям программы
бл

до тех пор, пока не закрыто диалоговое окно. Когда немодальное диалоговое


окно активно, фокус ввода может быть направлен другому окну программы.
При этом другие части программы остаются активными и доступными. Диало-
Би

говые окна обслуживает класс Dialog. Обычно используются следующие кон-


структоры класса:

Dialog(Frame parentWindow, boolean mode);


Dialog(Frame parentWindow, String title, boolean mode);

parentWindow – владелец диалогового окна. Если mode имеет значение


true, диалоговое окно является модальным. Иначе оно немодальное. Заголовок
диалогового окна можно передать через параметр title.
47
Следующий пример демонстрирует фреймовое окно с меню, из которого вы-
бором пунтов меню File→DemoDialog вызывается модальное диалоговое окно.

Пример 3.8
Листинг Frame1.java
import java.awt.*;
import java.awt.event.*;
public class Frame1 extends Frame
implements ActionListener,WindowListener{
Menu file;MenuItem item1;

Р
public Frame1(){
super("Фреймовое окно с меню");

УИ
setSize(500,300);
//создать строку главного меню и добавить его во фрейм
MenuBar mbar=new MenuBar();

БГ
setMenuBar(mbar);
//создать элемент меню
file=new Menu("File");
mbar.add(file);
а
file.add(item1=new MenuItem("DemoDialog"));
ек

item1.addActionListener(this);
setVisible(true);
addWindowListener(this);
т

}
public void actionPerformed(ActionEvent ae) {
ио

DemoDialog d=new DemoDialog(this,"Диалоговое окно",true);


}
public void windowClosing(WindowEvent we){
бл

this.dispose();
}
public void windowActivated(WindowEvent we){};
Би

public void windowClosed(WindowEvent we){};


public void windowDeactivated(WindowEvent we){};
public void windowDeiconified(WindowEvent we){};
public void windowIconified(WindowEvent we){};
public void windowOpened(WindowEvent we){};
public static void main(String args[])
{Frame1 f=new Frame1();
}
class DemoDialog extends Dialog implements ActionListener{
48
Button btn;
public DemoDialog(Frame1 ff, String title,boolean b){
super(ff,title,b);
setLayout(new FlowLayout(FlowLayout.LEFT));
btn=new Button("Закрыть");
setSize(300,200);
add(btn);
btn.addActionListener(this);
setVisible(true);
}

Р
public void actionPerformed(ActionEvent ae){
this.dispose();

УИ
}
}
}

БГ
На рис. 3.2 показан результат работы программы:
а
Меню Фреймовое
ек

окно с меню
т

Диалоговое
ио

окно
с кнопкой
бл
Би

Рис. 3.2. Результат работы программы, приведенной в листинге Frame1.java

Задания для самостоятельного выполнения

1. Разработать приложение управления тремя списками, расположенны-


ми горизонтально. Приложение должно обеспечивать перемещение любого вы-
бранного элемента или содержимого всего списка в следующий список по ча-

49
совой стрелке: из первого – во второй, из второго в третий, из третьего в пер-
вый. Элемент при перемещении должен исчезать из одного списка и появ-
ляться в другом. Помимо того приложение должно обеспечивать управление
вторым списком – добавление нового элемента, редактирование, удаление.
2. Разработать приложение управления тремя списками, расположенны-
ми горизонтально. Приложение должно обеспечивать перемещение выбранного
элемента из первого во второй, из второго в третий, из третьего в первый спи-
сок и наоборот. Направление перемещения элемента из списка в список должно
определяться выбором из набора флажков (CheckboxGroup). Элемент при пе-
ремещении должен исчезать из одного списка и появляться в другом. Помимо

Р
того, приложение должно обеспечивать управление всеми списками – добавле-
ние нового элемента, редактирование, удаление.

УИ
3. Разработать приложение, обеспечивающее возможность множествен-
ного выбора элементов из списка. Выбранные элементы должны образовывать
строку текста и помещаться в текстовое поле. Предусмотреть возможность вы-

БГ
вода сообщения в диалоговое окно (Dialog) в случае, если суммарное количе-
ство символов будет превышать 100.
4. Разработать приложение, реализующее калькулятор. Приложение
должно иметь строку редактирования (TextField), набор кнопок 0…9, кнопки
а
арифметических действий – суммирование, вычитание, деление, умножение,
память.
ек

5. Разработать приложение, реализующее калькулятор. Приложение


должно иметь две строки редактирования (TextField). Набор флажков (Check-
т

boxGroup) определяет, какое арифметическое действие необходимо выполнить:


суммирование, вычитание, деление, умножение, память.
ио

6. Разработать приложение, обеспечивающее поиск в двух списках несов-


падающих фрагментов текста. Строки, в которых будут найдены искомые
фрагменты, должны быть выведены в диалоговое окно (Dialog) (предполагает-
бл

ся, что несколько строк может иметь такие фрагменты). Помимо этого, прило-
жение должно обеспечивать управление содержимым списков – добавление но-
вого элемента, редактирование, удаление.
Би

7. Разработать приложение управления тремя списками, расположенны-


ми на диалоге горизонтально. Приложение должно обеспечивать перемещение
некоторого (указанного в наборе флажков (CheckboxGroup)) количества вы-
бранных элементов из списка в список. Перемещение элементов осуществлять
слева направо. Элемент при перемещении не исчезает, а выделяется. Помимо
этого, приложение должно обеспечивать заполнение помеченного флажком
списка 10 строками. Предусмотреть очистку помеченного списка.
8. Разработать приложение управления списком. Вывести два флажка
(Сheckbox). При первом включенном флажке осуществляется выбор всех не-
50
четных строк, при втором включенном флажке осуществляется выбор всех чет-
ных строк и перенос их в раскрывающийся список (Choice).
9. Разработать приложение управления списком. Вывести два флажка
(Checkbox). При первом включенном флажке осуществляется выбор всех не-
четных строк и их удаление, при втором включенном флажке осуществляется
выбор всех четных строк и перенос их во второй список. Предусмотреть обнов-
ление элементов списка и очистку второго списка.
10. Разработать приложение, реализующее калькулятор. Приложение
должно иметь три строки редактирования (TextField) – для двух операндов и
результата. Набор флажков (CheckboxGroup) определяет, какое арифметическое

Р
действие необходимо выполнить: суммирование, вычитание, деление, умноже-
ние, очистку окон редактирования.

УИ
11. Разработать приложение управления тремя списками («Фамилия»,
«Имя», «Отчество») и строки редактирования (TextField). В строку редактиро-
вания вводится информация в формате «Фамилия Имя Отчество». По заверше-

БГ
нии ввода фамилия должна появиться в списке «Фамилия», имя – в списке
«Имя», отчество – в списке «Отчество». Предусмотреть вывод сообщения в
диалогое окно (Dialog), если количество введенных в списки ФИО будет пре-
вышать 10.
а
12. Разработать приложение управления тремя списками («Фамилия»,
«Имя», «Отчество») и строки редактирования (TextField). В строку редактиро-
ек

вания вводится информация в формате «Фамилия Имя Отчество». По заверше-


нии ввода фамилия должна появиться в списке «Фамилия», имя – в списке
т

«Имя», отчество – в списке «Отчество». Предусмотреть возможность множест-


венного выбора фамилий или отчеств в зависимости от выбора в наборе флаж-
ио

ков (CheckboxGroup) и вывода всех их в отсортированном порядке в диалоговое


окно (Dialog).
13. Разработать приложение, обеспечивающее поиск в двух раскрываю-
бл

щихся списках (Choice) фрагмента текста. Набором флажков (CheckboxGroup)


указывать, в каком списке будет осуществляться поиск. Строки, в которых бу-
дет найден искомый фрагмент, должны быть выделены (предполагается, что
Би

несколько строк могут иметь искомый фрагмент). Помимо этого приложение


должно обеспечивать управление содержимым списков – добавление нового
элемента, редактирование, удаление.
14. Разработать приложение, обеспечивающее возможность множест-
венного выбора элементов из списка. Выбранные элементы должны образовы-
вать строку текста и выводиться в соседний список. Предусмотреть возмож-
ность вывода сообщения в диалоговое окно (Dialog) в случае, если суммарное
количество символов будет превышать 100.

51
15. Разработать приложение управления тремя списками («Фамилия»,
«Имя», «Отчество») и строкой редактирования (TextField). Для отображения
строки редактирования вызывается диалоговое окно (Dialog). В строку редак-
тирования вводится информация в формате «Фамилия Имя Отчество». По за-
вершении ввода диалоговое окно закрывается, фамилия должна появиться в
списке «Фамилия», имя – в списке «Имя», отчество – в списке «Отчество». Пре-
дусмотреть возможность множественного выбора фамилий и записи их в от-
сортированном порядке в четвертый список.

Р
УИ
БГ
а
ек
т
ио
бл
Би

52
ЛАБОРАТОРНАЯ РАБОТА №4

РАЗРАБОТКА ПОЛЬЗОВАТЕЛЬСКОГО ИНТЕРФЕЙСА ДЛЯ РАБОТЫ


С БАЗАМИ ДАННЫХ

Цель: научиться разрабатывать GUI-приложения с использованием баз


данных.

Интерфейс JDBC
Разумеется, организовать доступ к базам данных для современного языка
программирования в наше время не представляет никакой сложности. Более того,

Р
и сами языки программирования более всего оцениваются разработчиками по ти-
пу и возможностям заложенных в них средств доступа к базам данных, удобству и

УИ
полноте интерфейсов. В этом смысле Java не представляет исключения. Уже в
версии JDK1.1 появился пакет классов java.sql, обеспечивающий большинство
функций, известных к тому времени разработчикам ODBC-приложений (Open Da-

БГ
taBase Connectivity). В этом пакете содержится ряд замечательных классов, на-
пример java.sql.CallableStatement, который обеспечивает выполнение на Java хра-
нимых процедур; java.sql.DatabaseMetaData, который исследует базу данных на
предмет ее реляционной полноты и целостности с получением самых разнообраз-
а
ных данных о типах и содержимом таблиц, колонок, индексов, ключей и т.д.; на-
ек

конец, java.sql.ResultSetMetaData, с помощью которого можно выводить в удоб-


ном виде всю необходимую информацию из таблиц базы данных или печатать са-
ми метаданные в виде названий таблиц и колонок.
т

Однако коренное отличие Java от других традиционных языков програм-


мирования заключается в том, что одни и те же функции доступа к базам дан-
ио

ных с помощью универсальности и кроссплатформенности Java можно органи-


зовать чрезвычайно гибко, используя все преимущества современных объект-
но-ориентированных технологий, WWW и Intranet/Internet.
бл

JDBC (Java DataBase Connectivity) является не протоколом, а интерфей-


сом и основан на спецификациях SAG CLI (SQL Access Group Call Level
Interface – интерфейс уровня вызова группы доступа SQL). JDBC – это стан-
Би

дартный прикладной интерфейс (API – Applicacion Programming Interface) язы-


ка Java для организации взаимодействия между приложением и СУБД (систе-
мой управления базами данных).
Сам по себе JDBC работать не может и использует основные абстракции и
методы ODBC. Хотя в стандарте JDBC API и предусмотрена возможность работы
не только через JDBC, а и через использование прямых ссылок к базам данных по
двух- или трехзвенной схеме (рис. 4.1), эту схему используют гораздо реже, чем по-
всеместно используемый JDBC-ODBC-Bridge (JDBC–ODBC–мост), занимающий
центральное место в общей схеме взаимодействия интерфейсов (рис. 4.2).
53
Р
УИ
Рис. 4.1. Непосредственный доступ к базе данных по трехзвенной схеме

БГ
а
ек
т
ио
бл

Рис. 4.2. Схема взаимодействия интерфейсов


Би

Даже беглого взгляда на рис. 4.2 вполне достаточно, чтобы понять – об-
щая схема взаимодействия интерфейсов в Java напоминает схему ODBC с ее
гениальным изобретением драйвер-менеджера к различным СУБД и единого
универсального пользовательского интерфейса. ODBC взят в качестве основы
JDBC из-за его популярности среди независимых поставщиков программного
обеспечения и пользователей.
JDBC API − это естественный Java-интерфейс к базовым SQL-абстракциям.
Восприняв основные абстракции концепции ODBC, он реализовался как настоящий
Java-интерфейс, согласующийся с остальными частями системы Java.
54
В отличие от интерфейса ODBC JDBC организован намного проще. Глав-
ной его частью является драйвер, поставляемый фирмой JavaSoft для доступа из
JDBC к источникам данных. Этот драйвер является самым верхним в иерархии
классов JDBC и называется DriverManager.
JDBC Driver Manager − это основной ствол JDBC-архитектуры. Его пер-
вичные функции очень просты − соединить Java-программу и соответствую-
щий JDBC-драйвер.
Согласно установившимся правилам Internet, база данных и средства ее
обслуживания идентифицируются при помощи URL (Uniform Resourse Locator).
В самом общем случае URL описывает электронный ресурс, такой как страница

Р
WWW или файл на сервере FTP (File Transfer Protocol – протокол передачи
файлов), способом, который уникальным образом идентифицирует этот ресурс.

УИ
JDBC же использует URL для идентификации расположений как драйверов, так
и источников данных. URL для JDBC имеют следующий формат:

БГ
jdbc: <подпротокол>://<идентификатор источника данных>

где jdbc указывает, что URL ссылается на источник данных JDBC. Подпрото-
кол определяет используемый драйвер JDBC. Например, может применяться
а
драйвер odbc. Идентификатор источника данных определяет источник дан-
ек

ных. Чтобы применить драйвер ODBC с источником данных ODBC


dBaseTestStudent, создается URL следующего формата:
т

jdbc:odbc: dBaseTestStudent
ио

В некоторых случаях вместо ODBC может быть использовано имя прямо-


го сетевого сервиса к базе данных, например:
бл

jdbc:dcenaming:accounts-payable,
или
Би

jdbc:dbnet://ultra1:1789/state

В последнем случае часть URL //ultra1:1789/state представляет собой и


описывает имя хоста, порт и соответствующий идентификатор для доступа к
соответствующей базе данных.
Однако, как уже говорилось выше, чаще всего все-таки используется ме-
ханизм ODBC благодаря его универсальности и доступности. Программа взаи-
модействия между драйвером JDBC и ODBC разработана фирмой JavaSoft в со-
55
трудничестве с InterSolv и называется JDBC-ODBC-Bridge. Она реализована в
виде JdbcOdbc.class (для платформы Windows JdbcOdbc.dll) и входит в поставку
JDK1.1. Помимо JdbcOdbc-библиотек должны существовать специальные
драйверы (библиотеки), которые реализуют непосредственный доступ к базам
данных через стандартный интерфейс ODBC. Как правило, эти библиотеки
описываются в файле ODBC.INI. На внутреннем уровне JDBC-ODBC-Bridge
отображает методы Java в вызовы ODBC и тем самым позволяет использовать
любые существующие драйверы ODBC, которых к настоящему времени накоп-
лено в изобилии.

Р
Типы драйверов в JDBC
Взаимодействие между приложением Java и СУБД осуществляется с по-

УИ
мощью драйверов JDBC, обеспечивающих реализацию общих интерфейсов для
конкретных СУБД и конкретных протоколов.
В JDBC определяются четыре типа драйверов:

БГ
Тип 1 – драйвер, использующий другой прикладной интерфейс, в частно-
сти ODBC, для работы с СУБД (так называемый JDBC-ODBC-мост). Стандарт-
ный драйвер типа 1 sun.jdbc.odbc.JdbcOdbcDriver входит в JSDK.
Тип 2 − драйвер, работающий через нативные библиотеки (т.е. клиента)
а
СУБД.
Тип 3 – драйвер, работающий по сетевому и не зависимому от СУБД
ек

протоколу с промежуточным java-сервером, который, в свою очередь, под-


ключается к нужной СУБД.
т

Тип 4 – сетевой драйвер, работающий напрямую с нужной СУБД и не


требующий установки нативных библиотек.
ио

Предпочтение естественным образом отдается второму типу, однако если


приложение выполняется на машине, на которой не предполагается установка кли-
ента СУБД, то выбор производится между третьим и четвертым типами. Причем
бл

четвертый тип работает напрямую с СУБД по ее протоколу, поэтому можно пред-


положить, что драйвер четвертого типа будет более эффективным по сравнению с
третьим типом с точки зрения производительности. Первый тип используется реже,
Би

в тех случаях, когда у СУБД нет своего драйвера JDBC, зато есть драйвер ODBC.

Последовательность работы с базами данных


Приложение, работающее с базами данных, имеет следующую обычную
последовательность действий:
1. Загрузка класса драйвера базы данных при отсутствии экземпляра этого
класса.
Для СУБД MySQL:
String driverName=”org.gjt.mm.mysql.Driver”;
56
Для СУБД MsAccess:
String driverName=”sun.jdbc.odbc.JdbcOdbcDriver ”;
После этого выполняется собственно загрузка драйвера в память:
Class.forName(driverName);
и становится возможным соединение с СУБД.
Эти же действия можно выполнить, импортируя библиотеку и создавая
объект явно:
Import COM.ibm.db2.jdbc.net.DB2Driver;
а затем
new Db2Driver();

Р
для СУБД DB2.

УИ
2. Установка соединения с базами данных в виде:
Connection cn=
DriverManager.getConnection

БГ
(“jdbc:mysql://localhost/mydb”,”login”,”pass”);
или
Connection cn=
DriverManager.getConnection(“jdbc:odbc:Konditerskaya”);
а
В результате будет возвращен объект Connection и будет установлено со-
ек

единение с соответствующей базой данных.


Класс DriverManager предоставляет средства для управления набором
т

драйверов баз данных. Методу getConnection() необходимо передать тип и фи-


зическое месторасположение базы данных, а также логин и пароль для доступа.
ио

С помощью метода registerDriver() драйверы регистрируются, а методом get-


Drivers() можно получить список всех драйверов.
бл

3. Создание объекта для передачи запросов


Statement st=cn.createStatement();
Объект класса Statement используется для выполнения запроса без его
Би

предварительной подготовки и команд SQL. Могут применяться также опера-


торы для выполнения подготовленных запросов и хранимых процедур Pre-
paredStatement и CallableStatement. Созданный объект можно использовать для
выполнения запроса.

4. Выполнение запроса
Результаты выполнения запроса помещаются в объект класса ResultSet:
ResutSet rs=st.executeQuery(“SELCT * FROM mytable”);

57
Для добавления или изменения информации в таблице вместо метода ex-
ecuteQuery() запрос помещается в метод executeUpdate().
5. Обработка результатов выполнения запроса производится методами
интерфейса ResultSet, где самыми распространенными являются next() и get-
String(), а также методы getDate(), getInt(), getShort(), getBytes(), getFloat(), get-
Time(), getDouble(), getLong(), getClob(), getBlob(). Среди них следует выделить
методы getClob() и getBlob(), позволяющие извлекать из полей таблицы специ-
фические объекты (Character Large Object, Binary Large Object), которые могут
быть, например, графическими или архивными файлами. Эффективным спосо-
бом извлечения значения поля из таблицы является обращение к этому полю по

Р
его позиции в строке.
При первом вызове метода next() указатель перемещается на таблицу ре-

УИ
зультатов выборки в позицию первой строки таблицы ответа. Когда строки за-
кончатся, метод возвратит false.

6. Закрытие соединения
cn.close();

БГ
Если база больше не нужна, соединение закрывается.

Следующий пример демонстрирует консольное приложение для работы с


а
базой данных. Создается консольное приложение, которое связывается с базой
ек

данных, реализованной в Microsoft Access. В базе данных в одной табличке хра-


нится информация о кондитерском ассортименте. Программа выводит инфор-
мацию, хранимую в таблице, добавляет записи, удаляет и редактирует их.
т

Пример 4.1
ио

Листинг DBClass.java
import java.awt.*; // импортирование пакета awt
import java.net.*; // импортирование пакета для работы в сети
бл

import java.sql.*; // импортирование пакета sql


import java.io.*; // импортирование пакета ввода-вывода
public class DBClass{ // объявление класса DBClass
Би

static void menu(){// объявление метода menu ()


// вывод в консоль пунктов меню
System.out.println("Vyberite punkt menu:");
System.out.println("1-Prosmotr assortimenta");
System.out.println("2-Vstavka");
System.out.println("3-Udalenie");
System.out.println("4-Redaktirovanie");
System.out.println("5-Vyhod");
}
58
public static void main(String args[]){// объявление метода main ()
// объявление переменных
String nazv, cena, naim; int massa;
// создание буферизированного символьного потока ввода
BufferedReader stdin = new BufferedReader(new
InputStreamReader(System.in));
BufferedReader in=new BufferedReader(new
InputStreamReader(System.in));
String url="jdbc:odbc:Konditerskaya";// ссылка на драйвер базы данных
try{

Р
Class.forName("sun.jdbc.odbc.JdbcOdbcDriver");// подключение
//интерфейса JAVA-ODBC, без которого JAVA не сможет связаться

УИ
//с установленным ODBC-драйвером.
Connection db=DriverManager.getConnection(url); // установление
//соединения с базой данных

БГ
while(true){//бесконечный цикл
menu();//вывод пунктов меню
Statement sq=db.createStatement();//cоздание объекта
//для передачи запросов
а
String vybor = stdin.readLine();// чтение строки, вводимой с клавиатуры
if(vybor.equalsIgnoreCase("1")){// выполнение, если введено «1»
ек

// формирование строки запроса


String sq_str="SELECT * FROM Assortiment";
т

ResultSet rs= sq.executeQuery(sq_str); // команда на выполнение запроса


System.out.println("|Naimenovanie\t|Nazvanie\t|Massa\t|Cena|");
ио

while(rs.next()){// начало цикла для доступа к найденным записям


nazv=rs.getString("Nazvanie");// возвращает содержимое поля Nazvanie
cena=rs.getString("Cena");// возвращает содержимое поля Cena
бл

// возвращает содержимое поля Naimenovanie


naim=rs.getString("Naimenovanie");
// возвращает содержимое поля Massa
Би

massa=rs.getShort("Massa");
System.out.println("|"+naim+"\t|"+nazv+"\t|"+cena+"\t|"+massa+"\t|");
} }
else if (vybor.equalsIgnoreCase("2")){// выполнение, если введено «2»
System.out.println("Mogete dobavit' novuyu produkciyu:");
System.out.println("Vvedite naimenovanie:");
naim=in.readLine();// чтение наименования, вводимого с клавиатуры
System.out.println("Vvedite nazvanie:");
nazv=in.readLine();// чтение названия, вводимого с клавиатуры
59
System.out.println("Vvedite cenu:");
cena=in.readLine();// чтение цены, вводимой с клавиатуры
System.out.println("Vvedite massu:");
// чтение массы, вводимой с клавиатуры
massa=Integer.parseInt(in.readLine());
// формирование строки запроса
String sq_str="INSERT INTO Assortiment VALUES
('"+naim+"','"+nazv+"','"+
cena+"',"+massa+")";
int rs= sq.executeUpdate(sq_str); // команда на выполнение запроса

Р
}
else if (vybor.equalsIgnoreCase("3")){// выполнение, если введено «3»

УИ
System.out.println("Mogete udalit' assortiment:");
System.out.println("Vvedite naimenovanie assortimenta:");
naim=in.readLine();// чтение наименования, вводимого с клавиатуры

БГ
// формирование строки запроса
String sq_str="DELETE FROM Assortiment WHERE Naimenovanie
='"+naim+"'";
int rs= sq.executeUpdate(sq_str); // команда на выполнение запроса
а
}
else if (vybor.equalsIgnoreCase("4")){ // выполнение, если введено «4»
ек

String vibor;
System.out.println("Vvedite naimenovanie assortimenta,kotoroe hotite redakti-
т

rovat");
vibor=in.readLine();// чтение наименования, вводимого с клавиатуры
ио

System.out.println("Vvedite novoe naimenovanie:");


naim=in.readLine();// чтение наименования, вводимого с клавиатуры
System.out.println("Vvedite novoe nazvanie:");
бл

nazv=in.readLine();// чтение названия, вводимого с клавиатуры


System.out.println("Vvedite novuju cenu:");
cena=in.readLine();// чтение цены, вводимой с клавиатуры
Би

System.out.println("Vvedite novuju massu:");


// чтение массы, вводимой с клавиатуры
massa=Integer.parseInt(in.readLine());
// формирование строки запроса
String sq_str="UPDATE Assortiment SET Naimenovanie='"+naim+
"',Nazvanie='"+nazv+"',Cena='"+cena+"',Massa="+massa+
" WHERE Naimenovanie='"+vibor+"'";
int rs= sq.executeUpdate(sq_str); // команда на выполнение запроса
}
60
else if (vybor.equalsIgnoreCase("5")){// выполнение, если введено «5»
db.close();//закрытие соединения
System.exit(0);//выход из программы
}
}
}
catch(Exception e){
System.out.println("Error"+e);
}
}

Р
}

УИ
Для запуска приложения необходимо сначала в Microsoft Access создать
таблицу Assortiment, которая должна содержать следующие поля (табл. 4.1):

БГ
Таблица 4.1
Описание таблицы Assortiment
Имя поля Тип данных
Naimenovanie Текстовый
а
Nazvanie Текстовый
ек

Cena Денежный
Massa Числовой
т

Далее необходимо заполнить таблицу данными, например (табл. 4.2):


ио

Таблица 4.2
Данные таблицы Assortiment
бл

Naimenovanie Nazvanie Cena Massa


Tort Napoleon 50,00 р. 2000
Pirognoe Oduvanchik 5,00 р. 100
Би

Rulet Oreshek 10,00 р. 500


Pirognoe Zavarnoe 4,00 р. 150

Файл базы данных необходимо сохранить на диске, например d:\db1.mdb.


Далее следует прописать имя источника данных. Для этого необходимо вы-
брать «Пуск→ Настройка→ Панель управления→ Администрирование→ Ис-
точники данных (ODBC)». Появится окно «ODBC Data Source Administrator». В
этом окне необходимо нажать кнопку «Add». В появившемся окне выбрать
драйвер, для которого необходимо прописать имя источника данных. В данном
61
случае необходимо выбрать «Driver do Microsoft Access (*.mdb)» и нажать
кнопку «Готово». В появившемся окне «Установка драйвера ODBC для
Microsoft Access» в поле «Имя источника данных» прописать «Konditerskaya».
Потом нажать кнопку «Выбрать» и выбрать мышью сам файл d:\db1.mdb. После
выполнения необходимо нажать кнопку «OK».
Далее необходимо запустить саму программу. Появится следующее:
Vyberite punkt menu:
1-Prosmotr assortimenta
2-Vstavka
3-Udalenie

Р
4-Redaktirovanie
5-Vyhod

УИ
Введем например «1». Появится
|Naimenovanie |Nazvanie |Massa |Cena|
|Tort |Napoleon |50.0000 |2000 |

БГ
|Pirognoe |Oduvanchik |5.0000 |100 |
|Rulet |Oreshek |10.0000 |500 |
|Pirognoe |Zavarnoe |4.0000 |150 |
Vyberite punkt menu:
а
1-Prosmotr assortimenta
ек

2-Vstavka
3-Udalenie
4-Redaktirovanie
т

5-Vyhod
Далее, выбирая соответствующие пункты меню, можно добавить, уда-
ио

лить, отредактировать записи таблицы. После выбора пункта «5» приложение


завершит свое выполнение.
бл

Задания для самостоятельного выполнения

С использованием графического интерфейса пользователя требуется


Би

разработать приложение, взаимодействующее с базой данных. Приложение


должно позволять:
1) добавлять, удалять, редактировать записи;
2) осуществлять поиск информации;
3) осуществлять сортировку информации;
4) сохранять результаты в файл.
В качестве СУБД использовать Microsoft Access. В базе данных должны при-
сутствовать поля разных типов (минимальные требования: числа, текст и дата).

62
1. Разработать подсистему учета и регистрации проживающих в гости-
нице. Использовать классы CheckBox, List, диалог поиска.
2. Разработать подсистему учета и регистрации нормативных докумен-
тов предприятия. Использовать классы Choice, TextArea, диалог о программе.
3. Разработать подсистему учета и регистрации продаж телевизоров в
магазине техники. Использовать классы CheckboxGroup, Choice, диалог под-
тверждения удаления.
4. Разработать подсистему учета и регистрации информации об успевае-
мости студентов. Использовать классы CheckBox, TextArea, диалог добавления
оценок.

Р
5. Разработать подсистему учета и регистрации автомобилей в ГАИ. Ис-
пользовать классы CheckBox, List, диалог поиска.

УИ
6. Разработать подсистему учета и регистрации поступлений цветов в
цветочный магазин. Использовать классы List, Choice, диалог подтверждения
обновления.

БГ
7. Разработать подсистему учета и регистрации расхода стройматериалов.
Использовать классы Checkbox, Choice, диалог фильтрации.
8. Разработать подсистему учета и регистрации прибыли от выполняе-
мых ремонтных работ. Использовать классы TextArea, List, диалог выбора ра-
а
бот, где размещены 2 списка и кнопки управления этими списками.
9. Разработать подсистему учета и регистрации величины выплат фир-
ек

мы по больничным листам сотрудников. Использовать классы List, Choice, диа-


лог фильтрации.
т

10. Разработать подсистему учета и регистрации подписки на периодиче-


ские издания. Использовать классы TextArea, Checkbox, диалог с информацией
ио

о программе.
11. Разработать подсистему учета и регистрации затрат на рекламу пар-
фюмерной фирмы. Использовать классы Checkbox, Choice, диалог фильтрации
бл

по затратам.
12. Разработать подсистему учета и регистрации посещений поликлиники
больными. Использовать классы TextArea, Choice, диалог фильтрации.
Би

13. Разработать подсистему учета и регистрации заявок на выполнение


ремонтных работ в ЖЭС. Использовать классы Choice, List, диалог выбора ра-
бот, где размещены 2 списка и кнопки управления этими списками.
14. Разработать подсистему учета и регистрации выдачи книг в библиоте-
ке. Использовать классы TextArea, List, диалог поиска.
15. Разработать подсистему учета и регистрации входящих и исходящих
документов предприятия. Использовать классы CheckboxGroup, TextArea, диа-
лог фильтрации.

63
Литература

1. Ноутон, П. Java 2 / П. Ноутон, Г. Шилдт; пер. с англ. – СПб. : BHV –


Санкт-Петербург, 2000.
2. Хортон, А. Java 2– JDK 1.3. В 2 т. Т. 1. / А. Хортон; пер. с англ. – М. :
«Лори», 2002.
3. Хортон, А. Java 2– JDK 1.3. В 2 т. Т. 2. / А. Хортон; пер. с англ. – М. :
«Лори», 2002.
4. Блинов, И. Н. Java 2: практ. рук. / И. Н. Блинов, В. С. Романчик. –
Минск : УниверсалПресс, 2005.
5. Дейтел, Х. М. Технологии программирования на Java 2. В 3 кн. Кн. 1:

Р
Графика, JavaBeans, интерфейс пользователя / Х. М. Дейтел, П. Дж. Дейтел,
С. И. Сантри. – СПб. : BHV − Санкт-Петербург, 2000.

УИ
6. Дейтел, Х. М. Технологии программирования на Java 2. В 3 кн. Кн. 3:
Корпоративные системы, сервлеты, JSP, Web-сервисы / Х. М. Дейтел,
П. Дж. Дейтел, С. И. Сантри. – СПб. : BHV − Санкт-Петербург, 2000.
7. Флэнаган, Д. Java: справочник / Д. Флэнаган; пер. с англ. – М. : Символ,
2004.

БГ
8. Вязовик, В. С. Программирование на Java: курс лекций для вузов по
спец. I - 35 14 00 «Приклад. информатика» / В. С. Вязовик. – М. : Интернет-
университет информ. технологий, 2003.
а
9. Лабораторный практикум по курсу «Разработка информационных сис-
ек

тем в WWW» для студ. спец. Э.01.03.00. В 2 ч. Ч.1. / A. В. Лепеш [и др.]. –


Минск : БГУИР, 2002. – 68 с.
10. Языки программирования для разработки сетевых приложний: Язык
т

программирования JAVA: лаб. практикум для студ. спец. I - 27 01 01


«Экономика и организация производства», I - 26 02 03 «Маркетинг». В 2 ч.
Ч.1 / Т. М. Унучек [и др.]. – Минск : БГУИР, 2007. – 62 с.
ио
бл
Би

64
Св. план 2008, поз. 123

Учебное издание

Унучек Татьяна Михайловна


Сторожев Дмитрий Алексеевич
Унучек Евгений Николаевич и др.

Р
УИ
ЯЗЫКИ ПРОГРАММИРОВАНИЯ ДЛЯ РАЗРАБОТКИ СЕТЕВЫХ
ПРИЛОЖЕНИЙ: ЯЗЫК ПРОГРАММИРОВАНИЯ JAVA

БГ
ЛАБОРАТОРНЫЙ ПРАКТИКУМ
для студентов специальностей
I-27 01 01 «Экономика и организация производства»,
а
I-26 02 03 «Маркетинг»
дневной формы обучения
ек
т

В 2-х частях
ио

Часть 2
бл

Редактор Т. П. Андрейченко
Корректор Е. Н. Батурчик
Би

Компьютерная верстка Е. Г. Бабичева

Подписано в печать Формат 60х84 1/16. Бумага офсетная.


Гарнитура «Таймс». Печать ризографическая. Усл. печ. л.
Уч.-изд. л. 2,6. Тираж 150 экз. Заказ 3.

Издатель и полиграфическое исполнение: Учреждение образования


«Белорусский государственный университет информатики и радиоэлектроники»
ЛИ №02330/0056964 от 01.04.2004. ЛП №02330/0131666 от 30.04.2004.
220013, Минск, П. Бровки, 6

65

Вам также может понравиться