Програмування аплетів в Java. Обробка подій в Java

Інформація про навчальний заклад

ВУЗ:
Національний університет Львівська політехніка
Інститут:
Не вказано
Факультет:
Комп’ютерні науки
Кафедра:
Не вказано

Інформація про роботу

Рік:
2010
Тип роботи:
Методичні вказівки до лабораторної роботи
Предмет:
Об’єктно-орієнтоване програмування

Частина тексту файла (без зображень, графіків і формул):

МІНІСТЕРСТВО ОСВІТИ ТА НАУКИ УКРАЇНИ НАЦІОНАЛЬНИЙ УНІВЕРСИТЕТ “ЛЬВІВСЬКА ПОЛІТЕХНІКА”  Програмування аплетів в Java. Обробка подій в Java. Методичні вказівки до виконання лабораторної роботи №9 з курсу “Об’єктно-орієнтоване програмування” для студентів базового напрямку 6.0804 “Комп’ютерні науки” ЗАТВЕРДЖЕНО на засіданні кафедри “Системи автоматизованого проектування” Протокол № 1 від 30.08.2010 ЛЬВІВ 2010 Мова програмування Java. Методичні вказівки до виконання лабораторної роботи №9 “Програмування аплетів в Java. Обробка подій в Java.” з курсу: “Об’єктно-орієнтоване програмування” для студентів базового напрямку 6.0804 “Комп’ютерні науки”. Укладачі: Каркульовський В.І., доцент, к.т.н. Керницький А.Б., ст.викл., др.інж. Відповідальний за випуск: Рецензенти: 1. МЕТА РОБОТИ Одержати навики побудови алгоритмів лінійних обчислювальних процесів, навчитися складати алгоритми та програмувати процеси з розгалуженням, циклами, ітераційними циклами за допомогою мови Java. Одержати навички роботи із масивами. 2.ОСНОВНІ ТЕОРЕТИЧНІ ВІДОМОСТІ 2.1. ОПЕРАТОРИ МОВИ JAVA 14.1. Аплет До сих пір ми створювали додатки (applications), працюючі самостійно (standalone) в JVM під управлінням графічної оболонки операційної системи. Ці додатки мали власне вікно верхнього рівня типу Frame, зареєстроване у віконному менеджері (window manager) графічної оболонки. Крім додатків, мова Java дозволяє створювати аплети (applets). Це програми, що працюють в середовищі іншої програми - браузера. Аплету не потрібне вікно верхнього рівня - їм служить вікно браузера. Вони не запускаються JVM — їх завантажує браузер, котрий сам запускає JVM для виконання аплету. Ці особливості відбиваються на написанні програми аплета. З точки зору мови Java, аплет — це всяке розширення класу Applet, котрий, в свою чергу, розширяє клас Panel. Таким чином, аплет - це панель спеціального виду, контейнер для розміщення компонентів з додатковими властивостями і методами. Менеджером розміщення компонентів по замовчуванню, як і в класі Panel, служить FІowLayout. Класс Applet знаходиться в пакеті java.applet, в якому крім нього єсть тільки три інтерфейси, реалізовані в браузері. Треба відмітити, що не всі браузери реалізують ці інтерфейси повністю. Оскільки JVM не запускає аплет, відпадає необхідність в методi main(), його немає в аплетах. В аплетах рідко зустрічається конструктор. Справа в тому, що при запуску першого створюється його контекст. Під час виконання конструктора контекст ще не сформований, тому не всі початкові значення вдається визначити в конструкторі. Початкові дії, зазвичай виконувані в конструкторі і методі main(), в аплеті записуються в метод init() класу Applet. Цей метод автоматачно запускається виконуючою системою Java браузера зразу ж післе завантаження аплета. Ось як він виглядає у вихідному коді класу Applet: public void init(){} Не густо! Метод init() не має аргументів, не повертає значення і повинен перевизначатися в кожному аплеті — підкласі класу Applet. Зворотні дії — завершення роботи, звільнення ресурсів — записуються при необхідності в метод destroy(), також виконуваний автоматично при вивантаженні аплету. В класі Applet єсть пуста реалізація цього методу. Крім методів init() і destroy() в класі Applet присутні ще два пустих методи, виконувані автоматично. Браузер повинен звертатися до методу start() при кожній появі аплету на екрані і звертатися до методу stop(), коли аплет зникаєт з eкрана. В методі stop() можна визначити дії, зупиняючі роботу аплета, в методі start() — відновлюючі її. Треба зразу ж відмітити, що не всі браузери звертаються до цих методів як повинно. Так, перший із розглянутих нижче аплетів HelloWorld.html мені не вдалося запустити браузером Internet Explorer, прийшлося скористатися власним Java браузером appletviewer, як пояснено далі. Роботу указаних методів можна пояснити простим житійським прикладом. Приїхавши весною на дачу, ви прокладаєте водопровідні труби, прикручуєте крани, протягуєте шланги - виконуєте метод init() для своєї зрошувальної системи. Після цього, приходячи на ділянку, включаєте крани — запускаєте метод start(), а виходячи, виключаєте їх — виконуєте метод stop(). Нарешті, восени ви розбираєте зрошувальну систему, відкручуєте крани, просушуєте і укладуєте водопровідні труби - виконуєте метод destroy(). 14.2. Найпростіший аплет Перераховані вище методи init(), start(), stop(), destroy() не є обовязковими при написанні простих аплетів, які не займають багато памяті, як свідчить наступний приклад. В лістинзі 14.1 записаний простенький аплет, виконуючий вічну програму HelloWorІd. Лістинг 14.1. Аплет HelloWorld import java.awt.*; import java.applet.*; public class HelloWorld extends Applet{ public void paint(Graphics g){ g.drawstring("Hello, XXI century World!", 10, 30); } } Ця програма записується в файл HelloWorld.java і компілюється зазвичай: javac HelloWorld.java. 14.3. Виконання аплета Компілятор створює файл HelloWorld.class, але скористатися для його виконання інтерпретатором java теперь не можна немає методу main(). Замість інтерпретації треба дать вказівку браузеру для запуску аплета. Всі вказівки браузеру даються помітками, тегами (tags), на мові HTML (HyperText Markup Language). Зокрема, вказівка на запуск аплета даєтсья в тезі <applet>. В ньому обовязково задається імя файла з класом аплета параметром code, ширина width і висота height панелі аплета в пікселях. Повністю текст HTML для нашого аплета приведений в лістинзі 14.2. Лістинг 14.2. Файл HTML для завантаження аплета HelloWorІd <html> <head><title> Applet</title></head> <body> <br> <applet code = "HeІІoWorld.class" width = "200" height = "100"> </applet> </body> </html> Цей текст заноситься в файл з розсширенням html або htm, наприклад HelloWorld.html. Імя файла довільне, ніяк не звязано з аплетом або класом апплета. Обидва файли — HelloWorld.html і HelloWorld.class - поміщаються в один каталог на сервері, і файл HelloWorld.html завантажується в браузер, який може знаходитися в будь-якому місці Internet. Браузер, проглядаючи HTML-файл, виконає тег <appІet> і завантажить аплет. Після завантаження аплет зявиться у вікні браузера, як показано на рис. 14.1. В цьому простому прикладі можна помітити ще дві особливості аплетів. По-перше, розмір аплета задається не в ньому, а в тезі <applet>. Це дуже зручно, можна змінювати розмір аплета, не компілюючи його заново. Можна організувати аплет невидимим, зробивши його розміром в один піксель. Крім того, розмір аплета дозволяється задати в процентах по відношенню до розміру вікна браузера, наприклад, <applet code = "HelloWorld.class" width = "100%" height = "100%"> . По-друге, як видно на рис. 14.1, у аплета сірий фон. Такий фон був у перших браузерів, і аплет не виділявся із тексту у вікні браузера. Тепер у браузерах прийнято білий фон, його можна установити звичайним для компонентів методом setBackground(Color.white), звернувшись до нього в методs init(). В склад JDK будь-якої версії входить програма appІetviewer. Це найпростіший браузер, призначений для запуску аплетів з метою налаштування. Якщо під рукою немає Internet-браузера, можна скористуватися ним. AppІetviewer запускається з командного рядка: appІetviewer HelloWorld.html Рис. 14.2. appІetviewer показує аплет HelloWorld. Ви звернули увагу, що внизу вікна знаходиться напис Applet started , якого ми ніде не програмували. Якби ми змінили колір вікна аплета, а це ми зробимо згодом, то побачили б, що напис Applet started знаходиться на окремій смужці, так званій status bar. В ній програма запуску аплета appletviewer і інформує користувача, про стан аплета, в даному випадку він стартував. 14.4. Приклад більш складного аплета Як тільки що було сказано, у нижньому рядку браузера — рядку стану (status bar) — відображаються дані про завантаження файлів. Аплет може записати в нього будь-який рядок str методом showStatus(String str). В лістинзі 14.3 приведено аплет, записуючий в рядок стан браузера "біжучий рядок ", а в лістинзі 14.4 — відповідний HTML-файл. Перш ніж аналізувати наступну програму, ознайомтеся з методами substring() і CharAt() класу String. Лістинг 14.3. Біжучий рядок в рядку стану браузера // Файл RunningString.Java import java.awt.*; import java.applet.*; public class RunningString extends Applet{ private boolean go; //розширюємо клас Applet полем go public void start(){// реалізуємо пустий метод start() класу Applet go = true; sendMessage("This string is printed automatically by applet "); /* реалізацію метода sendMessage(String s) дивись нижче*/ } public void sendMessage(String s){// реалізуємо власний метод sendMessage(String s) String s1 = s+" "; // До String s додається пробіл while(go){ //Якщо аплет стартував, то String s висвічується у status bar showStatus(s); try{ /*блок try .. catch на випадок збою, при використанні класу Thread є обовязковим, бажаючі можуть прочитати про це в уроці 17, який ми, за браком часу, цього 2008 року розглянути не зможемо*/ Thread.sleep(200); /*так робиться пауза – метод sleep()статичний, тому обєкт класу Thread не створюємо*/ } catch(Exception e){} s = s1.substring(1)+s.charAt(0); /*Перший символ рядка переноситься в його кінець – починається формуватися копія рядка позаду оригіналу – ефект рухомого рядка.*/ s1 =s; // з одержаним рядком операція повторюється в циклі while } } //Закінчується процедура формування копії рядка public void stop(){ /* метод stop() зараз не рекомендують застосовувати, так як при роботі в мережі він може вплинути на стан і інших моніторів. Аплет спрацює і без цього методу - перевірте*/ go = false; } } Лістинг 14.4. Файл RunningString.html <html> <head> <title> Applet</title></head> <body> <br> <applet code = "RunningString.class" width = "1" height = "1"> </applet> </body> </html> На жаль , немає строгого стандарту на виконаня аплетів, і браузери можуть запускати їх по-різному. Програма appІetviewer здатна показати аплет не так, як браузери. Приходиться перевіряти аплети на всіх наявних браузерах, добиваяючись однакового виконання. 14.5. Аплет, створюючий вікно Приведемо більш складний приклад. Аплет showWindow створює вікно someWindow типу Frame, в якому розташоване поле введення типу TextFieІd. В нього вводиться текст, і після натискання клавіші <Enter> переноситься в поле введення аплета. В аплеті присутня кнопка. Після кліку кнопкою миші по ній вікно someWindow то зникає з екрана, то знову зявляється на ньому. Програма приведена в лістингах 14.5 і 14.6, результат — на рис. 14.3. Лістинг 14.5. Аплет, створюючий вікно // Файл ShowWindow.java import java.awt.*; import java.awt.event.*; import java.applet.*; public class ShowWindow extends Applet{ private SomeWindow sw = new SomeWindow(); private TextField tf = new TextField(30); private Button b = new Button("Hide"); public void init(){ add(tf); add(b); sw.pack(); b.addActionListener(new ActShow()); sw.tf.addActionListener(new ActShow()); } public void start(){ sw.setVisible(true);} public void stop(){ sw.setVisible(false);} public void destroy(){ sw.dispose() ; sw = null; tf = null; b = null; } public class ActShow implements ActionListener{ public void actionPerformed(ActionEvent ae){ if (ae.getSource() = sw.tf) tf.setText(sw.tf .getText()) ; else if (b.getActionCommand() == "Show"){ sw.setVisible(true); b.setLabel("Hide") ; } else{ sw.setVisible(false); b.setLabel("Show"); } } } } class SomeWindow extends Frame{ public TextField tf = new TextField(50); SomeWindow(){ super(" Вікно введення"); add(new Label("Input, please, your name"), "North"); add(tf, "Center"); } } Лістинг 14.6. Файл ShowWindow.html <html> <head><title> ShowWindow Applet</title></head> <body> <br> <applet code = "ShowWindow.class" width = "400" height = "50"> </applet> </body> </html> Рис. 14.3. Аплет, створюючий вікно Зауваження по налаштуванню Браузери поміщають завантажені аплети в свій кэш, тому після кліку кнопкою миші по кнопці Refresh або Reload запускається стара копія апплета із кэша. Для завантаження нової копії треба при кліку по кнопці Refresh в IE (Internet Explorer) тримати натиснутою клавішу <Ctrl>, а при кліку по кнопці Reload в NC (Netscape Communicator) — клавішу <Shift>. Інколи і це не допомагає. Не врятовує навіть перезапуск браузера. Тоді треба очистити обидва кэші - і дисковий, і кэш в памяті. В IE це виконується кнопкою Delete Files у вікнs, викликаному набором команди Tools | Internet Options. B NC необхідно відкрити вікно Cache командою Edit | Preferences | Advanced. При запуску додатку інтерпретатором java із командного рядка в нього можна передати параметри у вигляді аргумента метода main(String [] args). В аплети також передаються параметри, але іншим шляхом. 14.3. Передача параметрів Передача параметрів в аплет відбувається за допомогою тегів <param>, розташованих між відкриваючим тегом <appІet> і закриваючим тегом </appІet> в HTML-файлі. В тегах <param> указується назва параметра name і його значення value. Передамо, наприклад, в наш аплет HeІІoWorІd параметри шрифту. В лістинзі 14.7 показано змінений файл HelloWorld.html. Лістинг 14.7. Параметри для передачі в аплет <html> <head><title> Applet</title></head> <body> <br> <applet code = "HelloWorld.class" width = "400" height = "50"> /*Далі йде те, що буде передано в аплет програмою appletviewer*/ <param name = "fontName" value = "Serif"> <param name = "fontStyle" value = "2"> <param name = "fontSize" value = "30"> </applet> </body> </html> В аплеті для прийому кожного параметра треба скористатися методом getParameter (String name) класу Applet, повертаючому рядок типу String. В якості аргумента цього методу задається значення параметра name у вигляді рядка, причому тут не розрізняється регістр літер, а метод повертає значення параметра value теж у вигляді рядка. Зауваження по налаштуванню Оператори System.out.println(), зазвичай записувані в аплет для налаштування, виводять указані в них аргументи в спеціальне вікно браузера Java Console. Спочатку треба установити можливість показу цього вікна. В Internet Explorer це робиться установкою прапорця Java Console enabled набором команд Tools | Internet Options | Advanced. Після перезапуску IE в меню View зявляється команда Java Console. В лістинзі 14.8 показано перероблений аплет HelloWorld. В ньому призначений білий фон, а шрифт установлюється з параметрами, добутими із HTML-файла. Лiстинг 14.8. Апплет, приймаючий параметри import java.awt.*; import java.applet.*; public class HelloWorld extends Applet{ public void init(){ setBackground(Color.white); String font = "Serif"; int style = Font.PLAIN, size = 10; /*наступні дані аплет отримає від програми appletviewer з файлу HelloWorld.html*/ font = getParameter("fontName"); style = Integer.parseInt(getParameter("fontStyle")); size = Integer.parseInt(getParameter("fontSize")); setFont(new Font(font, style, size)); } public void paint(Graphics g){ g.drawString("Hello, XXI century World!", 10, 30); } } Порада Сподіваючись на те, що параметри будуть задані в HTML-файлі, все-таки присвойте початкові значення змінним в аплеті, як це зроблено в лістинзі 14.8. На рис. 14.4 показано працюючий аплет. Рис. 14.4. Аплет із зміненим шрифтом Правила хорошого тону рекомендують описати параметри, передавані апплету, у вигляді масиву, кожний елемент якого — масив із трьох рядків, відповідаючий одному параметру. Дана структура представляється у вигляді "імя", "тип", "опис". Для нашого прикладу можна написати: String[][] pinfo = { {"fontName", "String", "font name"}, {"fontStyle", "int", "font style"}, {"fontSize", "int", "font size"} }; Потім перевизначається метод getParameterІnfo(), повертаючий указаний масив. Це пустий метод класу Applet. Будь-який обєкт, бажаючий узнати, що передать аплету, может викликати цей метод. Для нашого прикладу перевизначення вигляає так: public String[][] getParameterInfо(){ return pinfo; } Крім того, правила хорошого тону приписують перевизначити метод getAppletІnfо(), повертаючий рядок, в який записано імя автора, версія апплета і інші дані про аплет, котрі ви хотіли б представити всім бажаючим. Наприклад: public String getAppletInfo(){ return "MyApplet v.1.5 P.S.Ivanov"; } Подивимось тепер, які ще параметри можна задати в тезі <appІet>. 14.4. Параметри тега <applet> Перечислимо всі параметри тега <applet>. Обовязкові параметри: code — URL-адреса файла з класом аплета або архівного файла; width і height — ширина і висота аплета в пікселях. Необовязкові параметри: codebase — URL-адреса каталога, в якому розташований файл класу аплета. Яущо цей параметр відсутній, браузер буде шукати файл в тому ж каталозі, де розміщений відповіднийий HTML-файл; archive — файли всіх класів, складаючих аплет, можуть бути упаковані архіватором ZIP або спеціальним архіватором JAR в один або декілька архівних файлів. Параметр задає URL-адреси цих файлів через кому; align — вирівнювання апплета у вікні браузера. Цей параметр має одне із наступних значень: ABSBOTTOM, ABSMIDDLE, BASELINE, BOTTOM, CENTER, LEFT, MIDDLE, RIGHT, TEXTTOP, TOP; hspace і vspace — горизонтальні і вертикальні поля, відокремлюючі аплет від інших обєктів у вікні браузера в пікселях; download — задає порядок завантаження зображень аплетом. Імена зображень перечисляються через кому в порядку завантаження; name - імя аплета. Параметр потрібний, якщо завантажуються декілька аплетів з однаковими значеннями code і codebase; style — інформація про стиль CSS (Cascading Style Sheet); title — текст, відображуваний в процесі виконання аплета; alt — текст, що виводиться замість аплета, якщо браузер не може завантажити його; mayscript — не має значення. Це слово указує на те, що аплет буде звертатися до тексту JavaScript. Між тегами <applet> і </applet> можна написати текст, який буде виведений, якщо браузер не зможе зрозуміти тег <applet>. Ось повний приклад: <applet name = "AnApplet" code = "AnApplet.class" archive = "anapplet.zip, myclasses.zip" codebase = "http://www.some.com/public/applets" width = "300" height = "200" align = "TOP" vspace = "5" hspace = "5" mayscript alt = "If you have a Java-enabled browser, you would see an applet here."> <hr>If your browser recognized the applet tag, you would see an applet here.<hr> </applet> Порада Обовязково упаковуйте всі класи аплета в zip- і rаr-архіви і указуйте їх в параметрі archive в HTML-файлі. Це значно прискорить завантаження аплета. Слід ще сказати, що, починаючи з версії HTML 4.0, єсть тег <object>, призначений для завантаження і аплетів, і інших обєктів, наприклад, ActiveX. Крім того, деякі браузери можуть використовувати для завантаження аплетів тег <embed>. Ми уже згадували, що при завантаженні аплета браузер створює контекст, в якому збирає всі дані, необхідні для виконання аплета. Деякі дані із контексту можна передати в аплет. 14.5. Дані про оточення аплета Метод getCodeBase() повертає URL-адресу каталога, в кякому лежить файл класу аплета. Метод getDocumentBase() повертає URL-адресу каталога, в якому лежить HTML-файл, викликавший аплет. Браузер реалізує інтерфейс AppletСontext, що знаходиться в пакеті java.applet. Аплет може отримати посилку на цей інтерфейс методом getAppletContext(). За допомогою методів getApplet (String name) і getApplets() інтерфейса AppletСontext можна отримати посилку на указаний аргументом name аплет або на всі аплети, завантажені в браузер. Метод showDocument(URL address) завантажує в браузер HTML-файл з адресою address. Метод showDocument (URL address, String target) завантажує файл у фрейм, указаний другим аргументом target. Цей аргумент може приймати наступні значення: _seif — те ж вікно і той же фрейм, в якому працює аплет; _parent — батьківський фрейм аплета; _top — фрейм верхнього рівня вікна аплета; _blank — нове вікно верхнього рівня; name — фрейм або вікно з іменем name, якщо воно не існує, то буде створено. 14.6. Зображення і звук Ззображення в Java — це обєкт класу image, представляючий прямокутний масив пікселів. Його можуть показати на екрані логічні методи drawІmage() класу Graphics. Ми розглянемо їх детально в наступному уроці, а поки що нам знадобляться два логічні методи: drawlmage(Image img, int x, int y, ImageObserver obs) drawImage(Image img, int x, int y, int width, int height, ImageObserver obs) Методи починають рисувать зображення, не чекаючи закінчення завантаження зображення img. Більше того, завантаження не почнеться, поки не викликаний метод drawlmage(). Методи повертають false, поки завантаження не закінчиться. Аргументи (х, у) задають координати лівого верхнього кута зображення img; width і height — ширину і висоту зображення на екрані; obs — посилання на обєкт, реалізуючий інтерфейс ImageObserver, слідкуючий за процесом завантаження зображення. Останньому аргументу можна дати значення this. Перший метод задає на екрані такі ж розміри зображення, як і у обєкта класу image, без змін. Одержати ці розміри можна методами getWidth(), getHeight() класу Image. Інтерфейс ImageObserver, реалізований класом Component, а значить, і класом Applet, описує тільки один логічний метод imageUpdate(), виконуваний при кожній зміні зображення. Саме цей метод побуджує перерисовувати компонент на екрані при кожній його зміні. Подивимося, як його можна використовувати в процесі завантаження файлів із Internet. 14.7. Відслідковування процесу завантаження Якщо ви хоч раз бачили, як зображення завантажується із Internet, то помітили, що воно появляється на екрані по частинах по мері завантаження. Це відбувається в тому випадку, коли системна властивість awt.image. incrementalDraw має значення true. При поступанні кожної порції зображення браузер викликає логічний метод imageUpdate() інтерфейса ImageObserver. Аргументи цього методу містить інформацію про процес завантаження зображення img. Розглянемо їх: imageUpdate(Image img, int status, int x, int y, int width, int height); Аргумент status містить інформацію про завантаження у вигляді одного цілого числа, яке можна порівняти з наступними константами інтерфейса ImageObserver: WIDTH — ширина уже завантаженої частини зображеняя відома, і може бути одержана із аргументу width; HEIGHT — висота уже завантаженої частини зображеняя відома, і може бути одержана із аргументу height; PROPERTIES — властивості зображення уже відомі, їх можна одержати методом getProperties() класу Image; SOMEBITS — одержані пікселі, достатні для рисування маштабованої версії зображення; аргументи x, y, width, height визначені; FRAMEBITS — одержаний наступний кадр зображення, що містить декілька кадрів; аргументи x, y, width, height не визначені; ALLBITS — всезображення одержано, аргументи x, y, width, height не містять інформації; ERROR — завантаження зупинено, рисування перервано, визначений біт ABORT; ABORT — завантаження перервано, рисування призупинено до приходу наступної порції зображення. Ви можете перевизначити цей метод в своєму аплеті і використовувати його аргументи для слідкування за процесом завантаження і визначення моменту повного завантаження. Інший спосіб відслідкувати закінчення завантаження - скористатися методами класу MediaTracker. Вони дозволяють перевірити, чи не закінчено завантаження, або призупинити роботу аплета до закінчення звантаження. Один екземпляр класу MediaTracker може слідкувати за завантаженням декількох зареєстрованих в ньому зображень. 14.8. Клас MediaTracker Спочатку конструктором MediaTracker (Component comp) створюється обєкт класу для указаного аргументом компонента. Аргумент конструктора частіше всього this. Потім методом addlmage(Image img, int id) реєструється зображення img під порядковим номером id. Декілька зображень можна зареєструвати під одним номером. Після цього логічними методами checkID(int id), checkID(int id, boolean load) іcheckAll() перeвіряється, чи завантажено зображення з порядковим номером id або всі зареєстровані зображення. Методи повертають true, якщо зображення уже завантажено, false — в противному випадку. Якщо аргумент load рівний true, то відбувається завантаження всіх ще не завантажених зображень. Методи statusID(int id), statusID(int id, boolean load) і statusALL повертають ціле число, яке можна порівняти із статичними константами COMPLETE, ABORTED, ERRORED. Нарешті, методи waitForID(int id) і waitForAll() чекають закінчення завантаження зображення. В наступному уроці в лістинзі 15.5 ми застосуємо ці методи для очікування завнтаження зображення. Зображення, що знаходиться в обєкті класу image можна створити безпосередньо по пікселям, а можна одержати із графічного файла, типу GIF або JPEG, одним із двох методів класу Applet: getІmage(URL address) — задається URL-адреса графічного файла; getImage(URL address, String fileName) — задається адреса каталога address і імя графічного файла filename. Аналогічно, звуковий файл в аплетах представляється у вигляді обєкта, реалізуючого інтерфейс AudioСІip, і може бути отримний із файла типу AU, AIFF, WAVE або MIDI одним із трьох методів класу Applet з такими ж аргументами: getAudioClip(URL address) getAudioClip(URL address, String fileName) newAudioClip(URL address) Останній метод статичний, його можна використовувать не тільки в аплетах, але і в додатках. Інтерфейс AudioСlip із пакета java.applet дуже простий. В ньому всього три методи без аргументів. Метод play() програє мелодію один раз. Метод loop() нескінчено повторяє мелодію. Метод stop() зупиняє програвання. Цей інтерфейс реалізується браузером. Звичайно, перед програвнням звукових файлів браузер повинен бути звязаний із звуковою системою компьютера. В лістинзі 14.9 приведено простий приклад завантаження зображення і звуку із файлів, що знаходяться в тому ж каталозі, що і HTML-файл. На рис. 14.5 показано, як виглядає зображення, збільшене в два рази. Лістинг 14.9, Звук і зображення в аплеті import java.applet.*; import java.awt.*; import java.awt.image.*; public class SimpleAudioImage extends Applet{ private Image img; private Audioclip ac; public void init(){ img = getImage(getDocumentBase(), "gifIcon.gif"); ac = getAudioClip(getDocumentBase(), "spacemusic.au"); } public void start (){ ac.loop(); } public void paint(Graphics g){ int w = img.getWidth(this), h = img.getHeight(this); g.drawImage(img, 0, 0, 2 * w, 2 * h, this); } public void stop() { ac.stop(); } } Рис. 14.5. Виведення зображення у звуковому супроводі Жаль, що ви не можете з тексту лекції насолоджуватися звуками космічної музики. Перед виведенням на eкран зображення можна перетворити, але про це поговоримо в наступному уроці. Як бачите, аплету в браузері дозволено дуже мало. Це не випадково. Аплет, що зявився в браузері звідкисьо із Internet, може натворити немало бід. Він може бути викликаний із файла з цікавим текстом, невидимо обшукати файловую систему і викрасти секретні дані, або, навпаки, відкрити вікно, таке ж, в яке ви вводите пароль, і перехватить його. Тому браузер повідомляє при завнтаженні аплета: "Applet started", а в рядку стану вікна, відкритого аплетом, зявляється напись: "Warning: Applet Window". Але це не єдиний захист від аплета. Розглянемо цю проблему детальніше. 14.9. Захист від аплета Браузер може взагалі відмовитися від завантаження аплетів. В Netscape Communicator це робиться за допомогою прапорця Enable Java у вікні, викликаному командою Edit | Preferences | Advanced, в Internet Explorer — у вікні після вибору команди Tools | Internet Options | Security. В такому випадку говорити більше немає про що. Якщо ж браузер завантажує аплет, то створює йому обмеження, так звану "пісочницю" (sandbox), в яку попадає аплет, але вийти з якої не може. Кожний браузер створює свої обмеження, але як правило вони заключаються в тому, що аплет: не може звертатися до файлової системи машини, на якій він виконується, навіть для читання файлів або перегляду каталогів; може звязатися па мережі тільки з тим сайтом, з якого він був завантажений; не може прочитати системні властивості, як це робить, наприклад, додаток в лістинзі 6.4; не може друкувати на принтері, підключеном до того компютер, на якому він виконується; не може користуватися буфером обміну (clipboard); не може запустить додаток методом ехес(); не може використовувати "рідні" методи або завантажити бібліотеку методом load(); не може зупинити JVM методом exit(); не может створювати класи в пакетах java.*, а класи пакетів sun.* не може навіть завантажувати. Браузери могжуть посилити або ослабити ці обмеження, наприклад, дозволити локальним аплетам, завантаженим з тієї ж машини, де вони виконуються, доступ до файлової системи. Найменшим обмеженням підлягають довірені (trusted) аплети, що мають электронний підпис за допомогою класів із пакетів java.security.*. При створені додатку, що завантажує аплети, необхідо забезпечити засоби перовірки аплета і задати обмеження. Їх дає в розпорядження клас securityManager. Екземпляр цього класу або його потомка установлюється в JVM при запуску віртуальної машини статичним методом setSecurityManager(SecurityManager sm) класу System. Звичайні додатки не можуть використовувати даний метод. Кожний браузер розширяє клас SecurityManager по-своєму, установлюючи ті чи інші обмеження. Єдиний екземпляр цього класу створюється при запуску JVM в браузері і не може бути змінений. Заключення Аплети були спершу практичним застосуванням Java. За перші два роки існування Java були написані тисячі дуже цікавих і красивих аплетів, ожививших WWW. Маса аплетів розкидана по Internet, хороші приклади аплетів зібрані в JDK в каталозі demo\applets. В JDK увійшов цілий пакет java.applet, в який фірма SUN збиралась заносити класи, що розвивають і покращують аплети. Із збільшенням швидкості і покращенням якості компютерних мереж значення апплетів сильно упало. Тепер вся обробка даних, раніше виконувана аплетами, переноситься на сервер, браузер тільки завантажує і показує результати цієї обробки, становиться "тонким клієнтом". З іншого боку, зявилось багато спеціалізованих програм, в тому числі написаних на Java, завантажуючих інформацію із Internet. Така можливість єсть зараз у всіх музичних і відеопрогравачах. Фірма SUN більше не розвивє пакет java.applet. В ньому так і залишився один клас і три інтерфейси. В бібліотеку Swing увійшов класс JApplet, розширяючий клас
Антиботан аватар за замовчуванням

25.05.2016 15:05-

Коментарі

Ви не можете залишити коментар. Для цього, будь ласка, увійдіть або зареєструйтесь.

Ділись своїми роботами та отримуй миттєві бонуси!

Маєш корисні навчальні матеріали, які припадають пилом на твоєму комп'ютері? Розрахункові, лабораторні, практичні чи контрольні роботи — завантажуй їх прямо зараз і одразу отримуй бали на свій рахунок! Заархівуй всі файли в один .zip (до 100 МБ) або завантажуй кожен файл окремо. Внесок у спільноту – це легкий спосіб допомогти іншим та отримати додаткові можливості на сайті. Твої старі роботи можуть приносити тобі нові нагороди!
Нічого не вибрано
0%

Оголошення від адміністратора

Антиботан аватар за замовчуванням

Подякувати Студентському архіву довільною сумою

Admin

26.02.2023 12:38

Дякуємо, що користуєтесь нашим архівом!