МІНІСТЕРСТВО ОСВІТИ ТА НАУКИ УКРАЇНИ
НАЦІОНАЛЬНИЙ УНІВЕРСИТЕТ “ЛЬВІВСЬКА ПОЛІТЕХНІКА”
Кафедра САП
Програмування аплетів в Java. Обробка подій в Java
Методичні матеріали
до лабораторної роботи № 4 з курсу:
“Об’єктно-орієнтоване програмування”
для студентів базового напрямку
6.0804 “Комп’ютерні науки”
ЗАТВЕРДЖЕНО
на засіданні кафедри
“Системи автоматизованого проектування”
Протокол №
від
ЛЬВІВ 2007
Використання потоків в Java. Методичні матеріали до лабораторної роботи № 4 з курсу: “Об’єктно-орієнтоване програмування” для студентів базового напрямку 6.0804 “Комп’ютерні науки”.
Укладачі:
Макар В.М., доцент, к.т.н.
Загарюк Р.В., асистент.
Відповідальний за випуск:
Рецензенти:
1. МЕТА РОБОТИ
Метою роботи є придбання навиків роботи з подіями при програмуванні на мові Java, а також створення аплетів на мові Java.
2.ОСНОВНІ ТЕОРЕТИЧНІ ВІДОМОСТІ
2.1. АПЛЕТИ JAVA
2.1.1. Запуск аплетів
Аплети Java, на відміну від додатків, не є самостійні програми, а вбудовуються в Web-сторінки і виконуються під управлінням Web-браузера.
Програма-аплет запускається в документі HTML в контейнері <applet> ... </applet>.
У дескрипторі <applet> можна задати наступні атрибути:
Атрибут
Значення
Чи є обов'язковим
code
Ім'я файлу скомпільованого аплета (це повинен бути файл з розширенням.class)
Так
width
Ширина в пікселях того простору, який аплет займатиме на Web-сторінці
Так
height
Висота в пікселях того простору, який аплет займатиме на Web-сторінці
Так
codebase
Каталог на Web-сервері, де зберігаються .class-файлы, на які посилається атрибут code.
Ні
alt
Дозволяє указувати альтернативний, текст, який буде виведений на місці аплета у тому випадку, коли Web-браузер розпізнає дескриптор <applet>, але не підтримує мову Java.
Ні
name
Дозволяє задати ім'я для аплета. Після цього інші аплети на сторінці можуть звертатися до цього аплета по імені і обмінюватися з ним даними
Ні
align
Дозволяє вибрати режим вирівнювання аплета на сторінці. Можливі значення параметра - ті ж, що і для атрибуту align в дескрипторі <img>: top, texttop, middle, absmiddle, baseline, bottom, absbottom, left, right.
Ні
vspace
Дозволяє задати величину в пікселях верхнього і нижнього полів навколо аплета.
Ні
hspace
Дозволяє задати величину в пікселях правого і лівого полів навколо аплета.
Ні
У контейнері <applet> . </applet> можна також помістити текст, який буде виведений на Web-сторінці, якщо Web-браузер користувача не підтримує роботу з аплетами Java.
Результат роботи аплета Java можна проглянути або за допомогою Web-браузера, або за допомогою програми appletviewer, що входить до складу SDK (як параметр для цієї програми задається ім'я файлу HTML, аплета, що містить виклик).
2.1.2. Виконання аплетів
Оскільки аплети є розширенням класу Applet, оголошення первинного класу аплета повинне мати наступний вигляд:
модифікатори class ідентифікатор-аплета extends Applet
{
Тіло аплета
}
Оскільки оголошення класу Applet знаходиться в пакеті java.applet, який автоматично не підключається, в програмі повинен бути заданий оператор import для цього пакету, тобто оператор
import java.applet.*;
Оскільки аплет може виконуватися на інших комп'ютерах в мережі, йому, в цілях безпеки, віртуальною машиною Java (JVM) забороняється виконувати багато операцій, наприклад, перегляд і читання вмісту каталогів і файлів на комп'ютері, а також зміни вмісту існуючих файлів і запис нових файлів.
Життєвий цикл аплета містить наступні чотири етапи:
етап ініціалізації (initialization stage).
етап запуску (start stage).
етап останову (stop stage).
етап знищення (destroy stage).
На етапі ініціалізації створюється і завантажується об'єкт аплета. У цей момент зручно створювати об'єкти для аплета, а також ініціалізувати значення, необхідні при роботі аплета. Впродовж життєвого циклу ініціалізація виконується тільки один раз. Можна втрутитися в процес ініціалізації, перевизначивши метод init() класу Applet.
На етапі запуску система починає виконання аплета. Етап запуску може слідувати відразу ж після етапу ініціалізації або після повторного запуску аплета. Звичайне це відбувається тоді, коли користувач, працюючи з Web-браузером, повертається до сторінки, що містить аплет, після проглядання якої-небудь іншої сторінки. На відміну від етапу ініціалізації, етап запуску впродовж життєвого циклу може виконуватися безліч разів. Для того, щоб виконувався власний код запуску, необхідно перевизначити метод start() класу Applet.
Етап останову є протилежністю етапу запуску. Інтерпретатор виконує фазу останову, коли аплет більше не видно на екрані, наприклад, коли користувач звертається до іншої Web-сторінки. За умовчанням на цьому етапі аплет продовжує роботу у фоновому режимі. Якщо потрібно виконувати на етапі останову інші дії, необхідно перевизначити метод stop() класу Applet.
Етап знищення за призначенням протилежний етапу ініціалізації і починається тоді, коли система збирається видалити аплет з пам'яті. Подібно до фази ініціалізації, етап знищення виконується тільки один раз. Якщо аплет використовував ресурси, які перед знищенням аплета необхідно звільнити, то це потрібно робити на етапі знищення. Цю фазу можна змінити, перевизначивши метод destroy() класу Applet.
Можна вважати також, що між етапами останову і запуску існує етап промальовування (paint stage). Ця фаза виконується кожного разу, коли область відображення аплета повинна проектуватися на екран, тобто відразу ж після етапу запуску аплета, а також всякий раз, коли зображення аплета відновлюється або змінюється. Це відбувається, коли вікно аплета звільняється від того, що перекриває його іншого вікна, або коли програма змінює область відображення аплета і явно перемальовував його вікно.
2.1.3. Передача параметрів аплету
Середовищем виконання додатку Java є операційна система, і параметри в додаток передаються за допомогою завдання аргументів командного рядка при запуску додатку.
Аналогічний механізм існує і для передачі даних з документа HTML аплету Java.
Середовищем виконання аплета Java є Web-браузер, тому параметри передаються аплету в зухвалому його документі HTML за допомогою дескриптора <param>. Цей дескриптор задається для кожного параметра аплета і містить два обов'язкові атрибути: name - указує ім'я параметра і value - задає значення параметра.
Для того, щоб зробити доступним значення параметра, заданого в атрибуті value, в аплеті використовується метод класу Applet
· public String getParameter(String name)
· де name - ім'я параметра, задане в атрибуті name дескриптора <param>. Метод повертає рядок, що містить значення параметра, задане в атрибуті value.
· Якщо в дескрипторі <applet> немає дескриптора <param> з ім'ям, заданим як параметр, то метод getParameter() повертає рядок із значенням null.
2.2. Виведення графічного контексту
При створенні компоненту, тобто об'єкту класу Component, автоматично формується його графічний контекст (graphics context). У контексті розміщується область малювання і виведення тексту і зображень.
· Управляє контекстом клас Graphics або новий клас Graphics2D, введений в Java 2. Оскільки графічний контекст сильно залежить від конкретної графічної платформи, ці класи зроблені абстрактними. Тому не можна безпосередньо створити екземпляри класу Graphics або Graphics2D.
· Проте кожна віртуальна машина Java реалізує методи цих класів, створює їх екземпляри для компоненту і надає об'єкт класу Graphics за допомогою методу класу Component:
· public Graphics getGraphics(),
а також як аргумент методів paint() і update().
Методи класу Component: paint(),update(), а також repaint()используются для відображення (малювання на екрані) компоненту.
· Метод
· public void paint(Graphics g)
малює компонент на екрані. Як параметр використовується графічний контекст g - об'єкт класу Graphics. Цей метод повинен перевизначатися аплетом або графічним додатком.
Метод
· public void repaint()
указує, що компонент при першій нагоді повинен перемальовувати. Це рано чи пізно (але не відразу) приведе до виклику методу update().
У класі Graphics визначені наступні основні методи малювання для роботи з контурними малюнками:
· Методи малювання класу Graphics для роботи з контурними малюнками приведені в таблиці:
Метод
Опис
drawLine (int x1, int y1,
int x2, int y2)
Виводить лінію від позиції, заданої першими двома цілими числами (координати x1 і y1), до позиції, позначеної координатами x2и y2.
drawRect (int x, int y,
int width, int height)
Виводить прямокутник. Координати x і у указують верхній лівий кут прямокутника, width і height - відповідно ширину і висоту.
draw3DRect (int x, int y,
int width, int height,
boolean raised)
Виводить тривимірний прямокутник, що підсвічується. Сам прямокутник задається як і в методі drawRect, а булева змінна raised указує, чи повинен прямокутник бути піднятий над фоном.
drawRoundRect(int x,
int y, int width,
int height,
int arcWidth, int arcHeight)
Виводить прямокутник з округляючими кутами, вписаний в нормальний прямокутник, заданий першими чотирма параметрами. Параметри arcWidth і arcHeight указують ширину і висоту дуги для кутів.
drawOval (int x,
int y,
int width, int height)
Виводить овал, вписаний в прямокутник, визначений як в методі drawRect .
drawArc (int x, int y,
int width, int height,
int angleBegin, int angleEnd)
Виводить дугу, вписану в прямокутник, визначений як в методі drawRect. Параметри angleBegin і angleEnd указують початкові і кінцеві кути, вимірювані в градусах. Відлік кутів починається від центру правої сторони графічної області. Позитивні значення указують напрям обертання проти годинникової стрілки, а негативні - за годинниковою стрілкою.
drawPolygon (int[] xPoints, int[] yPoints, int nPoints)
Виводить багатокутник. Цілочисельні масиви містять координати x і у для крапок, що становлять багатокутник, а параметр nPoints указує загальну кількість крапок.
drawPolygon (Polygon name)
Виводить багатокутник. Багатокутник заданий об'єктом класу Polygon.
drawPolyline(int[] xPoints, int[] yPoints, int nPoints)
Виводить послідовність сполучених між собою ліній, кінці яких задаються координатами x і у, а параметр nPoints указує загальну кількість крапок (кількість ліній на 1 менша).
Клас Polygon забезпечує гнучкіший спосіб завдання багатокутників. Можна створити об'єкт класу Polygon, передавши конструктору
· Polygon (int x[], int y[], int pointsNumber)
масиви координат і кількість крапок.
2.3. Використання кольорів
Колірна модель, використовувана в Java, називається RGB (по початкових буквах слів Red - червоний, Green - зелений, Blue - синій). Це означає, що колір задається кількістю червоного, зеленого і синього кольору в ньому.
· Крім того, може бути задана прозорість кольору (компоненту alpha) - від повністю непрозорого до повністю прозорого (невидимого) кольору. Ця складова проявляє себе при накладенні одного кольору на іншій. Якщо alpha має максимальне значення, то колір абсолютно непрозорий, попередній колір не просвічує крізь нього. Якщо alpha рівна своєму мінімальному значенню, то колір абсолютно прозорий, для кожного пікселя видно тільки попередній колір.
Колір задається як об'єкт класу Color за допомогою конструкторів цього класу. Два конструктори:
· public Color(int r, int g, int b, int а)
· public Color(int r, int g, int b)
задають компоненти червоного (r), зеленого (g) і синього (b) кольору і alpha (a) у вигляді цілих чисел в діапазоні від 0 до 255 (у другому конструкторі alpha рівна 255).
Наступна пара конструкторів:
public Color(float r, float g, float b, float а)
public Color(float r, float g, float b)
задають компоненти кольору і alpha у вигляді дійсних чисел в діапазоні від 0.0f до 1.0f (у другому конструкторі alpha рівна 1.0f).
І, нарешті, пара конструкторів
· public Color(int rgba, boolean hasalpha)
· public Color(int rgb)
· задає компоненти кольору і alpha у вигляді одного шестнадцатерічного числа. У першому конструкторі значення alpha задається в бітах 24-31, якщо параметр hasalpha рівний true. Якщо ж hasalpha рівне false, то альфа, що становить, вважається рівною 0xFF, незалежно від того, що записане в старших бітах параметра rgba. У бітах 16-23 перший і другий конструктори записується червона складова, в бітах 8-15 - зелена, а в бітах 0-7 - синя складова кольору.
Кольори не завжди необхідно створювати, оскільки в класі Color є набір зумовлених кольорів, що задаються статичними змінними типу Color: Color.blue (синій колір), Color.white (білий колір), Color.lightGray (світло-сірий колір) Color.gray (сірий колір), Color.darkGray (темно-сірий колір), Color.black (чорний колір), Color.red (червоний колір), Color.pink (рожевий колір), Color.orange (оранжевий колір), Color.yellow (жовтий колір), Color.green (зелений колір), Color.magenta (пурпурний колір), Color.cyan (синьо-зелений, або ціаністий, колір).
Наступні методи класу Color дозволяють одержати складові поточного кольору:
public int getRed() - значення червоної компоненти (від 0 до 255);
· public int getGreen() - значення зеленої компоненти (від 0 до 255);
· public int getBlue() - значення синьої компоненти (від 0 до 255);
· public int getAlpha() - значення компоненти alpha (від 0 до 255);
· public int getRGB() - значення синьої компонент в бітах 31-0;
· public float[] getComponents(float[] compArray) - масив, що містить значення червоної, зеленої, синьої компонент і компоненти alpha (значення в діапазоні від 0.0f до 1.0f).
Два методи класу Color:
public Color brighter()
public Color darker() створюють яскравіший і темніший кольори в порівнянні з поточним кольором. Вони корисні в тих випадках, коли треба виділити активний компонент або, навпаки, показати неактивний компонент блідіше за решту компонентів.
Створивши колір, можна задати його як поточний колір для малювання за допомогою методу
public abstract void setColor (Color з)
класу Graphics.
Поточний колір малювання можна одержати за допомогою методу
public abstract Color getColor()
класу Graphics.
С допомогою методів
public void setForeground(Color з)
public void setBackground(Color з)
класу Component можна встановити (звичайно така установка виконується в методі init()) колір переднього плану (той колір, яким малюватимуться лінії і виводиться текст) і колір фону.
Поточного значення кольорів переднього плану і фону можна набути за допомогою наступних методів класу Component:
public Color getForeground()
public Color getBackground().
Всі методи малювання фігур, окрім drawArc(), drawLine() і drawPolyline(), мають відповідні методи заповнення замкнутої фігури, що виводиться, в класі Graphics: fillRect(), fill3Drect(), fillRoundRect(), fillOval(), fillPolygon(). Ці методи мають ті ж параметри, що і відповідні їм методи малювання. Колір заповнення фігури заздалегідь задається за допомогою методу setColor().
2.4. Виведення тексту
Підтримка виведення тексту реалізується в Java за допомогою методів класів Graphics, Font і FontMetrics.
Для виведення рядка у вікно аплета використовується метод
public abstract void drawString(String str, int x, int у)
класу Graphics, якому як параметри передається рядок str, а також координати x і у початку базової лінії. Слід зазначити, що на відміну від виведення фігур, в яких значення x і у задаються для лівого верхнього кута, для напису як початкова точка задається фактично лівий нижній кут, що слід мати на увазі при розміщенні напису на екрані.
Для виведення тексту в програмі на Java використовується один з шрифтів, званий стандартним шрифтом або шрифтом за умовчанням.
Для того, щоб змінити шрифт тексту, що виводиться, задається в Java, його спочатку треба визначити як об'єкт класу Font за допомогою конструктора:
Font(String name, int style, int size)
У параметрі name задається найменування, або гарнітура, шрифту (typeface). Ім'я шрифту може бути рядком з фізичним ім'ям шрифту, наприклад, "Courier New", або один з рядків "Dialog", "DialogInput", "Monospaced", "Serif", "sansSerif", "Symbol". Це так звані логічні імена шрифтів (logical font names). Якщо name рівне null, то задається шрифт за умовчанням.
При виведенні тексту логічним іменам шрифтів і стилям зіставляються фізичні імена шрифтів або імена сімейств шрифтів. Це імена реальних шрифтів, наявних в графічній підсистемі операційної системи.
Наприклад, логічному імені "serif" може бути зіставлено ім'я сімейства (family) шрифтів Times New Roman, а в поєднанні із стилями - конкретні фізичні імена Times New Roman Bold, Times New Roman Italic. Ці шрифти повинні знаходитися у складі шрифтів графічної системи тієї машини, на якій виконується додаток.
У параметрі style указується зображення, або стиль, шрифту (font style): Font.PLAIN (звичайний), Font.BOLD (напівжирний) і Font.ITALIC (курсив), Font.BOLD | Font.ITALIC (напівжирний курсивний), а в параметрі size задається розмір, або кегль, шрифту (point size). Кеглем в поліграфії називають розмір шрифту в друкарських пунктах. При висновку на принтер один пункт відповідає 1/72 дюйма, але при висновку на екран це співвідношення не завжди дотримується.
Установка нового шрифту при виведенні тексту в методі paint() виконується за допомогою методу класу Graphics
public abstract void setFont(Font font).
С допомогою методів
public String getName()
public int getStyle()
public int getSize()
класу Font можна одержати характеристики поточного шрифту.
2.5. Модель делегування подій в Java
Починаючи з JDK 1.1, в Java були змінена модель обміну інформацією про події, названа моделлю делегування подій.
Модель делегування подій працює таким чином. Кожен елемент взаємодії між інтерфейсом користувача і програмою визначається як подія. Класи додатків з'ясовують свою зацікавленість в деякій очікуваній певним компонентом події шляхом опиту компоненту і видачі йому пропозиції помістити в список зведення про блок прослуховування даного компоненту (listener). Коли відбувається деяка подія, джерело події повідомляє про нього зареєстровані блоки прослуховування.
Події, як і виключення, утворюють ієрархію класів. Коренем цієї ієрархії є клас EventObject, що розширює клас Object. Події, пов'язані з графічним інтерфейсом користувача, у свою чергу, утворюють гілку в ієрархії класів подій, коренем якої є клас AWTEvent, що розширює клас EventObject.
2.5.1. Обробка низькорівневих подій
Існують два різних типу подій - низькорівневі і семантичні.
Низькорівневі події пов'язані з фізичними аспектами інтерфейсу користувача - клацаннями миші, натисненнями клавіш клавіатури і т.д.
У наступній таблиці приведені різні низькорівневі події і операції, які генерує кожна подія (кожна подія відповідає методу в інтерфейсі прослуховування):
Семантичні події будуються на базі низькорівневих подій. Наприклад, для вибору команди меню може потрібно розкрити список команд першим клацанням миші, а потім другим клацанням вибрати в ньому необхідну команду. Ця послідовність низькорівневих подій може бути об'єднана в одну семантичну подію.
Класи низькорівневих і високорівневих подій, пов'язаних з GUI і AWT, містяться в пакеті java.awt.event.
У кожному класі подій визначені відповідні властивості і методи для обробки подій. У таблиці приведені основні методи для класів KeyEvent (обробка подій, пов'язаних з клавіатурою) і MouseEvent (обробка подій, пов'язаних з мишею):
Клас
Метод
Результат
KeyEvent
public char getKeyChar()
Повертає символ, відповідний натиснутій клавіші.
public int getKeyCode()
Повертає ціле число - код натиснутої клавіші.
public String getKeyText()
Повертає ім'я натиснутої клавіші, наприклад "Shift", "Ctrl" або "S".
MouseEvent
public int getClickCount()
Повертає число клацань миші, пов'язаних з цією подією.
public Point getPoint()
Повертає об'єкт Point, що містить координати курсора миші в мить, коли відбулася подія.
public int getX()
Повертає координату x курсора миші в мить, коли відбулася подія.
public int getY()
Повертає координату у курсора миші в мить, коли відбулася подія.
2.5.2. Блоки прослуховування
Майже кожен тип події, має пов'язаний з ним інтерфейс блоку прослуховування, в якому оголошені методи обробки даного типа події. Ці інтерфейси в свою чергу утворюють ієрархію інтерфейсів, коренем якої є інтерфейс EventListener.
Кожен блок прослуховування містить оголошення методів, оброблювальних дану подію. Список методів блоків прослуховування для низькорівневих подій KeyListener, MouseListener, MouseMotionListener і WindowListener приведений нижче.
Інтерфейс
Методи
KeyListener
public void keyPressed(KeyEvent e)
public void keyReleased(KeyEvent e)
public void keyTyped(KeyEvent e)
MouseListener
public void mouseClicked(MouseEvent e)
public void mouseEntered(MouseEvent e)
public void mouseExited(MouseEvent e)
public void mousePressed(MouseEvent e)
public void mouseReleased(MouseEvent e)
MouseMotionListener
public void mouseDragged(MouseEvent e)
public void mouseMoved(MouseEvent e)
WindowListener
public void windowActivated(WindowEvent e)
public void windowClosed(WindowEvent e)
public void windowClosing(WindowEvent e)
public void windowDeactivated
(WindowEvent e)
public void windowDeiconified
(WindowEvent e)
public void windowIconified(WindowEvent e)
public void windowOpened(WindowEvent e)
Для того, щоб блок прослуховування міг фіксувати і обробляти події він повинен бути включений за допомогою методів додавання блоків прослуховування в клас (ці методи визначені в класі Component).
Методи включення блоків прослуховування мають наступний загальний формат:
public void addXXXX (XXXX l)
де XXXX - ім'я відповідного блоку прослуховування, наприклад включення в клас блоку прослуховування для подій клавіатури реалізується за допомогою методу
public void addKeyListener (KeyListener l).
Таким чином, для обробки події в якому або класі необхідно:
1. Зробити доступним методи, визначені у відповідному інтерфейсі або інтерфейсах, оголосивши клас як реалізацію (implementation) відповідного інтерфейсу або інтерфейсів.
2. Включити необхідні блоки прослуховування за допомогою відповідного методу addXXXX.
3. Описати в програмі всі методи всіх реалізовуваних інтерфейсів (якщо який-небудь метод не використовується в класі, він оголошується з порожнім тілом - {). У методах інтерфейсів звичайно використовуються методи і властивості відповідного класу обробки подій.
Скелет програми (для обробки подій клавіатури) представлений нижчим:
class KeyTest implements KeyListener
{
...
addKeyListener(имя-объекта-KeyListener);
...
public void keyPressed(KeyEvent e)
{
Обробка події натиснення клавіші або порожньо
}
public void keyReleased(KeyEvent e)
{
Обробка події відпуску клавіші або порожньо
}
public void keyTyped(KeyEvent e)
{
Обробка введення символу або порожньо
}
}
Для того, щоб в класі можна було описувати тільки ті методи, які необхідно в JDK були введені абстрактні спеціальні класи - адаптери, що містять описи тих же методів, що і відповідні блоки прослуховування. Імена цих класів формуються так само, як і блоків прослуховування, тільки замість суфікса Listener в них використовується суфікс Adapter, наприклад, KeyAdapter або MouseAdapter.
Якщо створити усередині даного класу підклас, що розширює клас відповідного адаптера (наприклад, підклас myKeyAdapter, що розширює клас KeyAdapter), то усередині нього можна перевизначити тільки ті методи адаптера, які необхідно використовувати. В цьому випадку у відповідному методі addXXXX() як параметр можна задати екземпляр створеного підкласу, наприклад
addKeyListener(new myKeyAdapter());
Компактнішим записом, який часто використовується програмістами на Java, є безпосереднє визначення підкласу в параметрі відповідного методу addXXXX(), наприклад:
addKeyListener(
new KeyAdapter()
// Опис підкласу класу KeyAdapter
);
2.7. Вставка зображень в аплет
Істотною гідністю мови Java є наявність стандартних засобів роботи з графікою в програмах.
Мова Java має готові класи, здатні завантажувати файли зображень, проте ці класи забезпечують роботу тільки із зображеннями, представленими в графічних форматах GIF і JPEG (проте саме ці формати використовуються для вставки зображень в Web-сторінки).
Для вставки зображення в аплет необхідно виконати наступні кроки:
створити об'єкт URL (Universal Locator Resource - універсальний покажчик ресурсів) вказуючий на місцеположення графічного файлу;
створити об'єкт на базі класу Image і завантажити його в програму;
вивести зображення на екран.
Хоча можна просто вписати URL зображення в початковий текст програми, але в цьому випадку доведеться змінювати і перекомпілювати програму всякий раз при переміщенні графічного файлу в інший каталог на диску. Зручніший спосіб створення URL зображення - викликати метод
public URL getDocumentBase()
або метод
public URL getCodeBase()
класу Applet.
Перший метод повертає URL каталога, з якого був завантажений поточний файл HTML, а другий дозволяє одержати URL каталога, з якого була запущена програма. Метод getDocumentBase() зручніше використовувати тоді, коли зображення зберігаються в тому ж каталозі (або підкаталозі цього каталога), де знаходяться HTML-файли, а метод getCodeBase() - у тому випадку, коли зображення зберігаються в тому ж каталозі (або підкаталозі цього каталога), де знаходяться файли класів (з розширенням .class) для даної програми.
Результат виклику методу привласнюється об'єкту класу URL (цей клас визначений в пакеті java.net), наприклад:
URL codeBase = getCodeBase( );
Створення і його завантаження в пам'ять комп'ютера можна виконати одночасно з допомогою методу
public Image getImage(URL url, String name)
класу Applet, де url - URL, повернений методом getCodeBase() або getDocumentBase(), а name - відносна адреса зображення, наприклад:
Image myImage = getImage (CodeBase, "images/myImage.gif");
Для виведення зображення в аплеті досить викликати один з перенавантажуваних методів drawImage() класу Graphics. Найчастіше використовуються методи
public abstract boolean drawImage(Image img, int x, int у
ImageObserver observer)
public abstract boolean drawImage(Image img, int x, int у
int width, int height, ImageObserver observer)
де параметр img задає зображення, що виводиться, параметри x і у - координати зображення у вікні аплета, параметри width і height - ширину і висоту зображення (у першому методі вони беруться з графічного файлу), що виводиться, а параметр observer - об'єкт, який повідомляється про перетворення зображення (звичайно як цей параметр використовується ключове слово this), наприклад:
g.drawImage(myImage, 10, 20, this);
Клас Image має два методи
public abstract int getWidth(ImageObserver observer)
public abstract int getHeight(ImageObserver observer)
що повертають ширину і висоту зображення, наприклад:
int width = myImage.getWidth(this);
int height = myImage.getHeight(this);
g.drawImage(myImage, 10, 20, width, height, this);
Збільшити або зменшити розмір зображення, що виводиться на екран, можна, якщо змінити значення параметрів width і height при виклику методу drawImage(). Наприклад, задавши в попередньому прикладі значення width/2 і height/2, можна вивести на екран зменшене в два рази в порівнянні з оригіналом зображення.
3.КОНТРОЛЬНІ ЗАПИТАННЯ
Які атрибути дескриптора <applet> є обов'язковими для запуску аплета?
Які інструментальні засоби можна використовувати для проглядання аплета Java?
Які методи класу Applet дозволяють одержати інформацію про аплет?
Яка система координат використовується для малювання і виведення тексту в графічному режимі?
Які геометричні фігури можна малювати за допомогою методів класу Graphics?
Які методи маніпуляції з об'єктами визначені в Java?
Як можна задавати кольори в Java?
Які методи заповнення замкнутих геометричних фігур визначені в Java?
Як задаються характеристики шрифту, що виводиться, в Java?
Як виводиться напис в графічному режимі, і які параметри можна задати для напису?
Як в Java можна визначити ширину рядка, що виводиться, в пікселях?
Як функціонує модель делегування подій в Java?
Які методи визначені в Java для обробки подій миші і клавіатури?
Які дві групи подій визначені в Java, і чим вони відрізняються один від одного?
Які блоки прослуховування визначені для низькорівневих подій в Java?
Як реалізується включення блоку прослуховування в програмах Java?
Які дії необхідно виконати в програмі, для того, щоб вона могла обробляти події?
Як реалізується обробка подій за допомогою адаптерів?
Як можна вставити зображення в аплет?
4.ЛАБОРАТОРНЕ ЗАВДАННЯ
Напишіть аплет на мові Java по одному з приведених нижче варіантів.
5.ЗМІСТ ЗВІТУ
Мета роботи.
Короткі теоретичні відомості.
Постановка задачі індивідуального завдання.
Файли проекту.
Аналіз результатів результати виконання програми.
Висновки.
6. СПИСОК РЕКОМЕНДОВАНОЇ ЛІТЕРАТУРИ
Bruce Eckel, Thinking in Java, 2nd Edition, 2000.
ДОДАТОК
Варіант 1
Малювання ліній в графічному вікні. Лінії починаються при натисненні кнопки миші і продовжується при перетягуванні миші до тих пір, поки кнопка миші не буде відпущена.
Варіант 2
Малювання прямокутників в графічному вікні. При натисненні кнопки миші фіксується лівий верхній кут прямокутника. При відпуску миші фіксується правий нижній кут прямокутника, і прямокутник промальовувався на екрані.
Варіант 3
Переміщення зображення в графічному вікні. Спочатку зображення знаходиться в центрі вікна. При натисненні однієї з клавіш стрілок вгору, вниз, вліво або управо зображення стрибкоподібно переміщається в цьому напрямі.
Варіант 4
Малювання багатокутників в графічному вікні. При клацанні мишею фіксується чергова точка багатокутника. При подвійному клацанні мишею дана крапка з'єднується з першою точкою багатокутника і малювання багатокутника закінчується.
Варіант 5
Виведення символу клавіатури в заданій точці графічного вікна. Спочатку вводиться символ, а потім за допомогою клацання миші фіксується крапка, в якій виводиться символ.
Варіант 6
Висновок в лівому верхньому кутку графічного вікна поточних координат миші (x,y) при її переміщенні.
Варіант 7
Зміна фігури в графічному вікні. При натисненні клавіш 't'('T'), 's'('S') або 'o'('O') у вікні повинні з'являтися відповідно закрашений трикутник, квадрат або еліпс. При натисненні клавіші 'n'('N') фігура повинна віддалятися з вікна.
Варіант 8
Зміна кольору закрашеного прямокутника із закругленими кутами в графічному вікні. При натисненні клавіш 'r'('R'), 'g'('G') або 'b'('B') фігура повинна міняти колір зафарбовування відповідно на червоний, зелений або синій колір. При натисненні клавіші 'n'('N') фігура повинна бути кольори фону.
Варіант 9
Перетягування фігури закрашеного прямокутника в графічному вікні. При натисненні кнопки миші на фігурі і переміщенні миші фігура переміщається услід за мишею. При відпуску кнопки миші позиція фігури фіксується.
Варіант 10
Переміщення фігури закрашеного трикутника в графічному вікні. Спочатку фігура знаходиться в лівому верхньому кутку. При клацанні мишею в якій-небудь точці вікна аплета фігура поміщається в цю крапку.
Варіант 11
Зміна кольору закрашеного трикутника в графічному вікні. При клацанні мишею усередині фігури, трикутник циклічно міняє свій колір на червоний, синій, зелений і колір фону.
Варіант 12
При клацанні мишею по закрашеному прямокутнику із закругленими кутами в графічному вікні з'являється напис "Включено", а при повторному клацанні - напис "Вимкнено".
Варіант 13
При натисненні символу на клавіатурі цей символ виводиться в рядок в графічному вікні. При натисненні клавіші Enter висновок продовжується з нового рядка.
Варіант 14
При клацанні мишею по зображенню в графічному вікні воно міняється на інше зображення такого ж розміру, а при повторному клацанні відновлюється первинне зображення