Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Лекція 10 СМП.docx
Скачиваний:
1
Добавлен:
01.07.2025
Размер:
167 Кб
Скачать
☆

Аналіз роботи аплету Draw Applet

Коли ви закінчили малювати шедеври за допомогою аплету DrawApplet, саме час розглянути його роботу. Перші два рядки вихідного коду вказують на те, що аплет використовує класи в пакетах awt і applet:

import j ava.awt. *;

import j ava.applet. *;

Пакет awt (Abstract Windowing Toolkit – Універсальний віконний інтерфейс) містить класи для графічних зображень у віконному середовищі. Ці класи дають аплету доступ до методів, які дозволяють малювати на екрані, реагувати на події, маніпулювати елементами управління типу кнопок і меню і виконувати багато інших операцій. Пакет applet містить класи, необхідні для створення типового аплету.

Наступний оператор в програмі породжує DrawApplet від класу Applet, описаного в мові Java в пакеті applet:

public class DrawApplet extends Applet

Порада

Породжуючи свій клас аплету від Java-класу Applet, ви використовуєте переваги успадкування і автоматично отримуєте всі базові властивості аплету. Для того, щоб аплет працював так, як вам хочеться, потрібно тільки написати додатковий призначений для користувача код.

Далі в програмі можна бачити, як оголошуються поля (дані) аплету (див. лістинг 10.10).

Лістинг 10.10. LST10_10.TXT. Поля аплету DrawApplet

Point startPoint;

Point points!];

int numPoints;

boolean drawing;

Клас Point, описаний як частина пакету awt, являє собою структуру даних, яка може зберігати координати X, Y окремої точки екрану. Ціла змінна numPoints показує кількість точок в масиві Points[] класу Point, а булевська змінна drawing повідомляє програмі, чи знаходиться користувач в даний момент в режимі малювання.

Init()

Метод init() описаний в класі Applet, але перевизначений в класі DrawApplet для розширення можливостей аплету. Як ви знаєте, метод init() являє собою першу фазу життєвого циклу аплету. У класі DrawAppiet метод init() спочатку ініціалізує новий об'єкт Point так, щоб він містив початкову точку малювання:

startPoint * new Point (0, 0);

Операція new створює новий об'єкт, подібно до того, як це робиться в C++. В даному випадку нова точка має значення 0, що зберігається в її координатах х і у.

Після створення об'єкта початкової точки програма створює новий масив об'єктів Point:

points = new Point [1000];

Цей масив зберігає координати всіх лінійних сегментів, що утворюють користувальницький малюнок. Тут знову використовується операція new. В даному випадку, однак, створюється масив типу Point, що містить 1000 точок.

В наступних двох рядках метод init() ініціалізує дві змінні, що залишилися:

numPoints = 0;

drawing = false;

І нарешті, в останньому рядку цього методу програма встановлює розмір аплету:

resize (400, 300);

Метод resize() має два параметри: ширину і висоту аплету.

mouseDown()

Аплети, подібно до будь-яких інших віконних додатків, повинні відповідати на повідомлення, що посилаються системою. Часто ці повідомлення генеруються тоді, коли користувач викликає в додатку деяку подію. Якщо, наприклад, користувач клацає лівою кнопкою миші, аплету передається ознака появи події "кнопка_миші", який обробляється функцією mouseDown(). Параметрами цієї функції являються об'єкт Event і координати X, Y клацання миші. Цей метод має наступний вигляд:

public boolean mouseDown (Event evt, int x, int у)

В аплеті DrawAppiet в методі mouseDown() програма спочатку перевіряє, чи знаходиться в даний момент користувач в режимі малювання:

if (!Drawing)

Якщо ні, то клацання миші говорить про те, що користувач хоче почати малювання. В цьому випадку прапор drawing отримує значення true і початковій точці малювання присвоюються координати покажчика миші, визначені в момент клацання:

drawing = true;

startPoint.x = x;

startPoint.у = у;

Якщо програма вже перебувала в режимі малювання (прапор drawing дорівнював true), то гілка else просто скидає прапор drawing в значення false:

else

drawing = false;

Як ви побачите з опису методу paint(), при установці змінної drawing в значення false всі операції малювання припиняються.

mouseMove()

Коли користувач переміщує мишу в межах вікна аплету, аплет отримує потік повідомлень ''рух_миші". Аплет може відповідати на ці повідомлення, якщо перевизначити метод mouseMove() (який описується в пакеті awt в класі component). За зовнішнім виглядом метод mouseMove() дуже схожий на метод mouseDown() і приймає такі ж параметри:

public boolean mouseMove (Event evt, int x, int у)

Перебуваючи в режимі малювання користувач очікує, що під час руху миші програма буде малювати лінію. Тому в методі mouseMove() спочатку перевіряється статус режиму малювання. Також програма перевіряє, чи не перевищило число намальованих користувачем точок значення 1000:

if ((drawing) && (numPoints <тисячі))

Якщо користувач малює (і в масиві Points[] ще є місце для нових точок) функція додає нову точку в масив Points[]:

points [numPoints] = new Point (x, у);

++NumPoints;

Потім програма викликає метод repaint():

repaint();

Цей метод змушує аплет перемалювати свою область зображення, яка, як ми побачимо нижче, відображає малюнок користувача на екрані.

paint()

Метод paint() відповідає в аплеті за оперативне оновлення екрану аплету. Зазвичай код, який малює в області зображення аплету (яку іноді називають полотном), цілком розташовується в методі paint(), методи доступу якого викликаються щоразу, коли аплет хоче перемалювати своє вікно. Це може відбуватися при першій появі аплету на екрані або коли вікно аплету показується після зникнення вікна, яке закриває його, або коли програма явно викликає метод repaint().

Метод paint() має наступний вигляд:

public void paint (Graphics g)

Зауваження

Метод paint() отримує в якості параметру об'єкт Graphics, який представляє графічні завдання, які виконуються Java-програмою, подібні промальовуванню зображень або установці шрифтів. У аплеті DrawApplet програма використовує Graphics-об'єкт для малювання ліній на екрані.

Усередині використовуваної в аплеті DrawApplet версії методу paint() спочатку запам'ятовується початкова точка лінії:

int oldX = startPoint.х;

int oldY = startPoint.у;

Потім запускається цикл for, який перебирає масив Points[], використовуючи змінну numPoints (кількість точок, що зберігаються в цьому масиві) як значення для виходу з циклу:

for (int х=0; x<numPoints; ++х)

Всередині циклу програма малює лінію від точки з координатами oldx і oldy до наступної точки масиву, яка визначається індексом:

g.drawLine (oldX, oldY, points [x] .x, points [x] .y);

Функція drawLine() є методом класу Graphics, тому до методу drawLine() можна звертатися за допомогою змінної g, яка являє собою Graphics-об'єкт, переданий методу paint() в якості параметру. Чотири параметри методу drawLine() наступні: координати X, Y початку лінії і координати X, Y кінця лінії.

Після того, як лінія намальована, програма запам'ятовує кінцеву точку поточної лінії для використання в наступному проході циклу, де вона служить початковою точкою наступної лінії:

oldX = points [х] .х;

oldY = points [х] .y;

Цикл триває доти, поки весь малюнок не буде відтворено в області зображення аплету.