
- •Методичні вказівки
- •1.2.1. Методичні вказівки до використання базових типів даних
- •Void ChangeX(int X)
- •1.2.2. Методичні вказівки до використання бібліотеки класів Java
- •1.2.3. Використання убудованих класів
- •1.2.4. Використання класів, що заміщають базові типи
- •1.2.5. Використання класу String
- •1.2.6. Використання інших убудовані класів
- •1.2.7.4. Використання бібліотеки класів java.Awt
- •1.2.7.5. Використання бібліотеки класів java.Awt.Image
- •1.2.7.6. Використання бібліотеки класів java.Awt.Peer
- •1.2.7.7. Використання бібліотеки класів java.Applet
- •1.2.8. Використання покажчиків, яких немає
- •Integer nSomeValue;
- •1.2.9. Використання масивів в Java
- •Int[] nAnotherNumbers;
- •1.2.10. Використання спеціального процесу зборки сміття
- •Volume is 3000
- •4.4 Контрольні запитання та завдання
- •5.2.1. Створення простого апплету.
- •Import java.Awt.*;
- •Import java.Applet.*;
- •Void drawString(String повідомлення, int X, int y)
- •Void repaint()
- •Void repaint(int ліво, int догори, int ширина, int висота)
- •Import java.Awt.*;
- •Import java.Applet.*;
- •6.4 Контрольні запитання і завдання
4.4 Контрольні запитання та завдання
1. Поняття потоків. Їх призначення та можливості, які виникають під час їх використання.
2. Які можливості надає клас Thread? Назвіть загальні правила його використання.
3. Назвіть загальні принципи створення (проектування) багатопоточної програми. Коли є сенс розробляти багатопоточну програму?
4. Назвіть причини, чому неможна звертатися до візуальних компонентів безпосередньо із потоку.
5. Навіщо використовується synchronized ?
ЛАБОРАТОРНА РОБОТА. РОЗРОБКА АПЛЕТІВ У JAVA
5.1. Мета роботи
Вивчення практичних можливостей JAVA при створенні апплетів з створенням інтерфейсу .
5.2. Методичні вказівки до організації самостійної роботи студентів
При виконанні роботи треба враховувати, що апплети - це невеликі програми Java, призначені для передачі по Internet із наступним виконанням Web-броузером.
У процесі виконання роботи студент познайомиємиться з найбільшим пакетом Java - Abstract Window Toolkit (AWT).
5.2.1. Створення простого апплету.
Почнемо з простого прикладу, наведеного нижче:
// дуже простий апплет
Import java.Awt.*;
Import java.Applet.*;
public class SimpleApplet extends Applet {
public void paint(Graphics g) {
g. drawString("A Simple Applet", 20, 20);
}}
Перше, на що необхідно звернути увагу, - це те, що апплет починається з двох операторів import. Перший рядок імпортує класи Abstract Window Toolkit (AWT). Апплет взаємодіє з користувачем через AWT, а не через класи консольного введення/виводу. AWT підтримує графічний інтерфейс. AWT - це досить складна бібліотека, і повний опис її можливостей займе сотню сторінок. Прості апплети у даній роботі використовують невеликі ділянки AWT. Наступний оператор import імпортує пакет applet. Даний пакет містить клас Applet. Кожний створений апплет являє підкласом Applet.
Наступний рядок програми повідомляє клас SimpleApplet. Даний клас повинний бути оголошений як public, оскільки до нього відбувається звертання не з програми.
У SimpleApplet об'являється paint(). Даний приклад визначається AWT і повинний бути визначений апплетом. paint() визивається щораз, коли апплет повинний зробити вивід. Дана ситуація може виникнути з кількох причин. Наприклад, вікно, у якому апплет працює, було закрито іншим вікном і потім відчинилося. Або, наприклад, вікно могло бути мінімізоване, після чого було відновлено. Метод paint() також визивається, коли апплет починає роботу. Що б ні відбулося, але якщо ця подія приводить до необхідності виводу, то визивається paint(). Метод paint() одержує параметр типу Graphics.' Даний параметр містить графічний контекст, що описує графічне середовище, у якому працює апплет. Даний контекст використовується при виводі апплета.
У paint() є виклик drawString(), що являє членом класу Graphics. Даний метод виводить рядок у зазначених координатах Х и Y. Він має прототип:
Void drawString(String повідомлення, int X, int y)
Тут повідомлення - це рядок, виведений у позиції x, у. Верхній лівий кут вікна має координати 0, 0. Приведений виклик drawString виводить повідомлення “A Simple Applet” у позиції з координатами 20, 20.
Звернемо увагу, що апплет не має методу main(). На противагу програмам Java, апплети не починають виконання з main(). Фактично більшість апплетов узагалі не мають методу main(). Замість цього виконання апплета починається, коли ім'я його класу передається програмі для перегляду апплетов або мережному броузеру.
5.2.2. Компіляція та запуск аппалету.
Існує два способи компіляції і запуску апплета за допомогою Borland JBuilder. По-перше, можна скористатися інтегрованим середовищем розробки (ІСР). По-друге, можна використовувати рядковий компілятор.
Перед продовженням вивчення апплетів треба запам'ятати наступні ключові моменти:
1. Апплетам не потрібний метод main().
2. Апплети повинні запускатися за допомогою програми для перегляду апплетів або броузера, що підтримує Java.
3. Користувальне введення/вивід виконується не за допомогою системи консольного введення/виводу, а за допомогою інтерфейсу, наданого AWT.
5.2.5. Клас APPLET
Клас Applet дає всю необхідну для виконання апплета підтримку типу запуску і припинення. Також він дає методи для завантаження і виводу зображень і для завантаження і програвання аудиоклипів. Клас Applet розширює клас Panel, визначений у AWT і представляє собою просте вікно. У такий спосіб клас Applet дає всю необхідну підтримку для створення віконних додатків.
Оскільки апплет являє віконною програмою, його архітектура відрізняється від “звичайних”, консольних програм, розглянутих раніше.
Найважливіше в апплетах - це те, що вони являють подійно-керованими. Тому архітектура апплета схожа на набір підпрограм переривань. Апплет очікує, поки не відбудеться подія. AWT сповіщає апплет про подію викликом оброблювача події, визначеного в апплеті. Коли це відбувається, апплет повинний виконати необхідні дії і швидко повернути керування AWT. Це критичний момент. Як правило, апплет не повинний переходити в режим виконання якийсь задачі на досить довгі проміжки часу. Замість цього він повинний виконати необхідні дії у відповідь на подію і повернути керування системі часу виконання AWT. У ситуаціях, коли апплету необхідно виконати тривалу задачу (наприклад, вивести пересувне повідомлення у вікні), варто запустити на виконання потік.
Важливо також зрозуміти спосіб взаємодії користувача з апплетом. Як відомо, звичайні, невіконні програми у випадку, коли необхідно одержати визначене введення з боку користувача, видають підсказування і викликають метод, що здійснює введення, наприклад, readLine(). Апплет працює зовсім по-іншому. Користувач працює з апплетом так, як це йому необхідно і коли це йому необхідно. У результаті цих взаємодій користувача апплет одержує події, на які він повинний відреагувати. Наприклад, коли користувач клацає мишею, у вікні апплета генерується подія “щиглик миші”. Якщо користувач натискає клавішу, коли фокус уведення встановлений на вікно апплета, генерируется подія “натискання клавіші”. Апплет може містити різні елементи керування типу звичайних кнопок або незалежних кнопок. Коли користувач працює з яким-небудь із цих компонентів, також генерується подія.
Хоча архітектуру апплета нелегко зрозуміти в порівнянні з консольними програмами, AWT робить усе як можна простіше.
5.2.6. Ініціалізація і завершення aпплета.
Важливо зрозуміти порядок виклику різних методів у приведеному кістяку. На початку роботи апплета AWT викликає методи в наступній послідовності:
1. init()
2. start()
3. paint()
При завершенні апплета має місце наступна послідовність:
1. stop()
2. destroy()
При виконанні роботи треба познайомитись поближе з даними методами.
5.2.6.1. init()
Перший метод, що одержує керування при запуску апплета, - це init(). Тут, як правило, виконується ініціалізація апплета. Він визивається тільки один раз за увесь час виконання апплета.
3.2.6.2. start()
Метод start() використовується для перезапуску апплета. Він визивається відразу за методом init(). На відміну від init() він може визиватися декілька разів, оскільки визивається для перезапусу зупиненого апплета. Найбільше типовий спосіб припинення апплета - це коли користувач переходить до іншого сторінці. Коли користувач повертається на сторінку, що містить апплет, для перезапуску апплета визивається метод start().
Метод paint() визивається щораз, коли апплет повинний щось вивести. Метод paint() також визивається на початку виконання апплета.
5.2.6.3. stop()
Під час виконання апплета метод stop() може визиватися декілька разів. Наприклад, він визивається щораз, коли користувач виходить із сторінки, що містить апплет. Розглянемо апплет, що виконує об'ємні обчислення і дає результати користувачу. Якщо користувач іде зі сторінки, то визивається метод stop(). У методі stop() необхідно прийняти дії для припинення роботи апплета, коли він не відображається. Наприклад, може знадобитися затримати виконання потоку. Якщо користувач повернеться на сторінку, то автоматично визветься метод start() і код “разморозить” потоки. Даний підхід дозволяє уникнути непотрібної витрати процесорного часу, коли апплет не значний. Також користувач може пропустити важливі результати, коли апплет був поза полем видимості.
5.2.6.4. destroy()
Метод destroy() визивається тільки один раз під час виконання апплета - коли апплет повинний бути віддалений із пам'яті. Тут необхідно виконати дії по припиненню роботи апплета.
3.2.6.5. update()
У деяких випадках апплету може знадобитися переопределить ще один метод, визначений AWT - update. Даний метод визивається, коли апплету необхідно перемалювати частину вікна. Стандартна версія update() спочатку заповнює вікно апплета фоновим кольором, а потім викликає метод paint(). У деяких випадках, як, наприклад, коли не потрібно заповнювати фоновим кольором, апплети можуть переопределить дану функцію. Для простих прикладів даної глави стандартного поводження update() цілком достатньо. Але складні апплети часто переопределяют update().
5.2.7. Запит на перемалювання
Як правило, апплети виводять у вікно, тільки коли update() і paint() визиваються AWT. У результаті виникає цікаве питання - як апплет самий обновляє уміст вікна при зміні інформації? Наприклад, якщо апплет виводить развевающееся прапор, то який механізм він використовує для відновлення вікна при кожній зміні стани прапора? Треба пам'ятати, що одне з архітектурних обмежень, що нав'язуються апплету, - це те, що апплет змушений швидко повертати керування системі часу виконання. Не можна створити цикл у методі paint(), у якому відбувалося б перемалювання прапора, оскільки тоді керування не перейде AWT. Виходячи з даного обмеження, може показатися, що вивести у вікно апплета дуже важко. На щастя, це не так. Якщо апплету необхідно обновити інформацію, що міститься у вікні, то він просто викликає метод repaint.
Метод repaint() визначений у класі Applet. Він приводить до того, що система часу виконання здійснює виклик методу update(), що у стандартній реалізації викликає paint(). Таким чином, щоб вивести щось у вікно додатка просто треба здійснити вивід і викликати repaint(). AWT зробить виклик paint(), що відобразить виведену інформацію. Наприклад, якщо апплету необхідно вивести рядок, він може зберегти рядок у змінної типу String, після чого можна викликати repaint(). У paint вивід рядка здійснюється за допомогою drawString(). Метод repaint() має декілька форм. Тут описані дві найбільше часто використовуваних.
Найпростіший варіант repaint()- це: