Загрузка данных


Лабораторная работа № 4

4.1	Графический пакет AWT
Самой первой графической Java-библиотекой была библиотека AWT (Abstract Window Toolkit). Она была включена в первую версию JDK 1.0. Затем библиотека AWT была дополнена библиотекой Java 2D API, расширяющей возможности работы с двухмерной графикой и изображениями. Архитектура AWT устроена таким обра- зом, что компоненты размещаются в контейнерах (суперкласс java.awt.Container) По- мимо графических компонентов, библиотека AWT содержит классы и интерфейсы, позволяющие обрабатывать различные типы событий, генерируемые AWT-компо- нентами.
Суперклассом, представляющим все AWT-события, является класс java.awt.AWTEvent. Для обработки событий компонента необходимо создать класс- слушатель, реализующий интерфейс java.awt.event.ActionListener, и присоединить его к данному компоненту. Кроме пакетов java.awt и java.awt.event библиотека AWT включает в себя:
Пакет java.awt.color используется для создания цвета.
Пакет java.awt.datatransfer используется для передачи данных внутри приложе- ния и между приложениями.
Пакет java.awt.dnd реализует технологию Drag-and-Drop. Пакет java.awt.font обеспечивает поддержку шрифтов.
Пакет java.awt.geom реализует двухмерную геометрию.
Пакет java.awt.im обеспечивает поддержку нестандартных методов ввода тек-
ста.
 
Пакет java.awt.image используется для создания и редактирования графических изображений.
Пакет java.awt.print обеспечивает поддержку печати.
Иерархия классов AWT
Класс Component находится наверху иерархии AWT. Component – это абстракт- ный класс, который инкапсулирует все атрибуты визуального компонента. Объект Component отвечает за запоминание текущих цветов переднего плана и фона, выбран- ного шрифта текста, а также размеров и местоположения (рис. 25).



Рисунок 25 – Иерархия классов AWT
Container – это компонент AWT, который содержит другие компоненты, такие как кнопка, текстовое поле, таблицы и т. д. Контейнер является подклассом класса компонентов. Класс контейнера отслеживает и компонует добавляемые компоненты.
Класс Panel – это конкретный подкласс класса Container. Панель не содержит строку заголовка, строку меню или границу. Это контейнер, который используется для содержания компонентов. Класс Window создает окно верхнего уровня. Окно не имеет границ и меню.
Frame является подклассом класса Window и имеет заголовок и границы, а также изменяемый пользователем размер. Таким образом, для создания AWT при- ложения, в первую очередь, нужно создать объект Frame как окно верхнего уровня.
Мы создаем объект Frame, устанавливаем его размеры и делаем его видимым (см. лабораторную 2). В результате получаем окно с заголовком и кнопками миними- зации и закрытия окна. Однако закрыть такое окно мы не сможем (рис. 26). Для этого мы должны добавить слушателя событий окна.
 

 
Рисунок 26 – Объект Frame
Так как Frame – это контейнер, мы можем добавлять в него меню и другие эле- менты графического интерфейса пользователя, кнопки, метки, поля и т. д. Frame-кон- тейнер мы используем для работы с графикой.
Для работы с графикой в Java имеется класс Graphics пакета java.awt. Поскольку класс Graphics является абстрактным, т.к. графический контекст сильно зависит от конкретной графической платформы, создать экземпляры данного класса не удастся. Для простоты работы и снятия необходимости в самостоятельной реализации аб- страктных методов, каждая виртуальная машина Java реализует эти методы и создает объекты данного класса методом getGraphics() или с помощью аргумента метода paint(). В лабораторной работе мы использовали метод paint().
4.2	Построение графических примитивов
Класс Frame
Класс Frame поддерживает два конструктора:
Frame() – создает стандартное окно, которое не содержит заголовка; Frame(String заголовок) – создает окно с заголовком, указанным в пара- метре заголовок.
Методы класса Frame (см. лаб. 2)
1.	Метод setSize() используется для установки размеров окна. Существует две формы этого метода (с разными списками параметров).
2.	Метод getSize() используется для получения текущего размера окна.
3.	Метод setVisible() – показ окна.
4.	Метод setTitle() – установка заголовка окна.
Графические примитивы методы класса Graphics, которые используются для рисования фигур (см. лаб. 2).
Далее на примере рассмотрим процесс рисования.
 
Задание 1. Создание графического объекта
Создать класс статической отрисовки квадратов по диагонали окна Frame:

Этапы разработки программы:
1.	Создать проект с именем ProjectFor. Импортировать графические пакеты java.awt и javax.swing.
2.	Создать класс Picture, как расширение (наследник) класса JFrame пакета java.awt (см. лаб. №2, задание 3). Создать метод static void main(String[] args), форми- рующий объект класса Picture (), указав в качестве аргумента метода Название окна
«Рисунок».
3.	Создать конструктор с именем класса и строковым параметром s, который используется при обращении к конструктору суперкласса для записи параметра s в строку заголовка окна (значение параметра задается при создании объекта класса Picture ()).
4.	В теле конструктора определить следующие инструкции (см. лаб. №2):
1) обращение к конструктору суперкласса, 2) отключение менеджера расположения компонентов в окне, 3) установление размера окна (600x600, метод setSize класса Graphics), 4) указание вывода на экран создаваемого окна, 5) вызов метода заверше- ния программы после закрытия окна (указать конструкцию this перед методом, так как это метод суперкласса).
5.	Создать метод paintS(Graphics g), который реализует условие задачи (стати- ческое построение квадратов). В качестве аргумента метода используется переменная g типа Graphics (класс Graphics пакета awt). Эта переменная содержит графический контекст, включающий окно с панелью на которой имеются инструменты закрытия, свертывания, развертывания окна и с возможностью его названия:
g.setColor(Color.YELLOW); //установить желтый цвет (объект Color) g.fillRect(0, 0, 600, 600); //залить окно установленным цветом g.setColor(Color.blue);//установить синий цвет (объект Color)

int x1=0; //значение начальной точки по Х оси int y1=0; // значение начальной точки по Y оси
 
int x2=600; //размер окна по Х int y2=600; //размер окна по Y
g.drawLine(x1, y1, x2, y2); //прорисовка диагонали окна int c=50; //длины стороны квадрата
int z= x2*x2+y2*y2; //расчет длины диагонали окна
System.out.println(z); // вывод значения переменной z в консоль

int s= c*c + c*c; //расчет длины диагонали квадрата 50x50 System.out.println(s); //вывод значения переменной s в консоль

int i=0; //счетчик квадратов
g.fillRect (x1, y1, c, c); //прорисовка первого квадратам в 0 точке окна

while (s*++i<z) {пока сумма диагоналей прорисованных квадратов не станет больше длины диагонали окна
g.fillRect (x1+(i*c), y1+(i*c), c, c);//рисуем следующий квадрат
6.	Создать метод static void main(String[] args), создающий объект класса Picture ( ), указав в качестве аргумента метода Название окна «Рисунок».
Структура методов класса: класс Picture
метод main (String [] args) метод paintS (Graphics g)
Задание 2. Реализация динамики объекта
Создать на основе программы предыдущего задания класс с именем PictureD, реализующий процесс движения (динамики) заданного графического объекта по определенной в программе траектории (для рассмотренного примера – по диагонали). Для  этого  применить  задержку  рисования  по  времени  с  помощью  Ме- тода thread.sleep () (https://javarush.ru/groups/posts/isklyucheniya-java). Метод необхо- димо оформить следующим блоком:
try {
Thread.sleep(100);
} catch (InterruptedException e) { e.printStackTrace();	}
В этом случае создается впечатление, что объект (квадрат) движется (в рассмот- ренном примере по диагонали).
Метод прорисовки объектов назвать paintD (Graphics g).
 
Структура методов класса: класс Picture
метод main (String [] args) метод paintD (Graphics g)
Самостоятельное задание 1
Объединить в одном классе методы, созданные в предыдущих программах (ста- тический и динамический) и реализовать вызов одного из них по условию: если вве- сти с клавиатуры число 1 – вызывается статический метод и реализуется статическая прорисовка заданного объекта, если ввести с клавиатуры число 2 – вызывается дина- мический метод и реализуется динамическая прорисовка заданного объекта. Этапы программы:
Создать класс с именем с именем MyPicture, импортировать необходимые па- кеты. Сформировать метод public void paint(Graphics g), в котором реализуется вызов методов paintD или paintS по условию. Для этого необходимо: импортировать класс Scanner, создать экземпляр этого класса Scanner in = new Scanner(System.in), органи- зовать вывод сообщения в консоль (введите 1 или 2), в зависимости от введенного числа вызвать один из методов (paintS(g) или paintD(g)).
Структура методов класса MyPicture: класс Picture
метод main (String [] args) метод paint (Graphics g) метод paintS (Graphics g) метод paintD (Graphics g)