Аплети и събития в Java. 1Аплети



Дата27.03.2017
Размер127.98 Kb.

Аплети и събития в Java

.1Аплети


Аплетите представляват малки програми на Java, които се вграждат в HTML страници. Аплетът е част от една HTML страница, както примерно образ (картинка) или текст са част от нея. Както браузерът се грижи да зареди образ, посочен в HTML документа, така и браузерите, поддържащи Java, намират и стартират аплета. Когато вашият браузер, поддържащ Java, зареди един HTML документ, Java аплетът също се зарежда и изпълнява. Между браузерът, който ще стартира аплета, и системата, на която той се намира, се осъществява комуникация от тип клиент/сървър. В случая на аплет, клиент е системата, която се опитва да покаже HTML документ, съдържащ аплет. Сървърът е системата, която предоставя аплета за използване от други компютри. За потребителя тези комуникации са напълно невидими.
Java аплетите са един сигурен начин за обмен на програми по Internet, защото Java интерпретаторът не старира байткода на аплет докато не се увери, че оригиналният байткод не е повреден или променен по някакъв начин.


.2Жизнен цикъл на аплета


Всеки аплет, който създавате наследява класа Applet. Този клас предлага множество от полезни методи, които лежат в основата на всички аплети. Този клас заедно с други полезни класове и интерфейси (като например интерфейса AppletContext) се намира в пакета java.applet. Дори един аплет да не прави нищо особено, във фонов режим се извършва доста работа. Нека разгледаме четирите фази на жизнения цикъл на аплета. На всяка от тези фази съответства метод, който можете да пренапишете, ако искате да промените поведението на аплета.


  • Инициализация – В тази част се създават и зареждат обектите на аплета. Подходящо е тук да се инициализират стойностите на тези обекти. Тази фаза се изпълнява само веднъж при първото зареждане на страницата в браузера.




  • Стартиране – Тази фаза настъпва, когато системата стартира аплета. Тя може да се изпълни след инициализацията или когато аплетът се рестартира. Това обикновено се получава, когато потребителят се върне към вашия аплет, след като е разглеждал друга страница в браузера.За разлика от инициализацията, тази фаза може да се изпълни няколко пъти по време на жизнения цикъл на аплета. Ако пренапишете метода start() на класа Applet, ще можете да управлявате тази фаза.




  • Спиране – Тази фаза е противоположна на фазата стартиране. Java изпълнява тази фаза, когато аплетът не се вижда на екрана, което се получава например, когато се превключва между Web страници. По подразбиране, когато се изпълнява тази фаза, аплетът работи във фонов режим. Ако искате да промените това, просто пренапишете метода stop() на класа Applet.



  • Унищожаване – Тази фаза е противоположна на инициализацията. Тя се изпълнява, когато аплетът се премахне от паметта. Както инициализацията, тази фаза се изпълнява само веднъж. Ако аплетът използва ресурси, които трябва да бъдат унищожени преди излизането от него, трябва да направите това тук. За тази цел пренапишете метода destroy().



Забележка: Въпреки че не се приема официално, можем да смятаме, че между фазите на стартиране и спиране има още една фаза – визуализиране. Тя се изпълнява винаги, когато аплетът трябва да се изчертае на екрана.
Не е задължително пренаписването на споменатите методи, защото в класа Applet те са реализирани. Ако все пак желаете да промените някой от методите от жизнения цикъл, ето къде трябва да го направите:


import java.awt.*;

import java.applet.*;


public class MyApplet extends Applet {

public void init() {

//Тук се въвежда кодът за инициализация.

}

public void start() {



//Тук се въвежда кодът на жизнения цикъл start.

}

public void stop() {



//Тук се въвежда кодът на жизнения цикъл stop.

}

public void destroy() {



//Тук се въвежда кодът на жизнения цикъл destroy.

}

public void paint(Graphics g){



//Тук се въвежда кодът на жизнения цикъл paint.

}

}




Забележка: Ако искате да пренапишете метода paint(), трябва да включите библиотеките java.awt.*, които съдържат информация за класа Graphics. Този клас служи за извеждане на информация и графики на екрана.

.3Създаване и вграждане на аплет в HTML документ


Нека дадем един прост пример за аплет, който изписва текст на екрана.


import java.awt. Graphics;

import java.applet.*;


public class MyFirstApplet extends Applet {

public void paint(Graphics g){

q.drawString(“This is my first applet!”,0,50);

}

}


В програмата има използвани два класа. Първият е java.applet.Applet, а вторият е java.awt. Graphics. Този клас съдържа всички средства за чертане на екрана. Самият екран се третира кати обект от тип Graphics.


Включването на аплет в HTML страница става с подходящ таг :

code=” MyFirstApplet.class”

width=120

height=120






Атрибутът code задава името на файла на аплета, а атрибутите width и height задават размера на аплета. Атрибутите code, width и height са единствените задължителни неща за зареждане и стартиране на аплет. Има няколко допълнителни атрибута, които може да използвате с етикета . Първият атрибут е codebase, който показва базовата директория на аплета или URL (Uniform Resource Locator). Тази директория или URL се използват в допълнение към файла, зададен с атрибута code, за да се открие нужния файл. В случая на директория, атрибутът codebase задава относителния път до директорията от директорията на HTML документа. Ако codebase не фигурира, браузерът търси файла с аплета в директорията на HTML документа. Други допълнителни атрибути, които може да използвате в етикета са alt, name, align, hspace, vspace, archive. Атрибутът alt ви позволява да зададете текст, който ще се изведе в браузър, неподдържащ Java. Етикетът name задава име на аплета, което може да бъде използвано за обръщение към аплета. Атрибутите align, hspace и vspace задават позицията на аплета в Web страницата.

Освен атрибути тагът може да съдържа и подтагове, чрез които се дава възможност на потребител, разполагащ само с .class файла на аплета, да го конфигурира според собствените си нужди. Тагът


два атрибуте:


  • Name – указва името на параметъра;

  • Value - указва стойността на параметъра;

Нека видим, как става използването на параметри в аплет. В дадения пример е показан параметризиран аплет, който приема четири параметъра.


frame4
Аплетът получава параметрите по време на работа чрез метода getParameter(“име_на_параметър”). Извикването на този метод за всеки от параметрите заедно с други действия по инициализацията на аплета са поместени в метода init().Ето как изглежда и HTML документа, който зарежда аплета:
frame5

В този документ потребителят е указал, че текстът, който се извежда, е Display Text, големината му е 72 и започва от позиция (20,100).



Така създаденият аплет не поддържа проверка за валидни стойности или тяхната липса. Подобен аплет може да бъде допълнен с методи, даващи стойности по подразбиране на липсващи или невалидни параметри.

.4Пакетът JAVA.APPLET


Основната функционалност на аплетите се намира в класовете от този пакет. Той съдържа два класа (Applet и AudioClip) и два интерфейса (AppletContext и AppletStub). В таблица са разгледани някои методи, които са от съществена важност при разработката на аплети.
Полезни методи на класа Applet

Метод

Описание

 destroy()

Унищожава аплета

getAppletContext()

Връща съдържанието на аплета

getAppletInfo()

Връща символен низ с информация за аплета

getAudioClip()

Връща манипулатор към инстанция на обект от тип AudioClip

getCodeBase()

Връща URL, от където е стартиран аплета

getDocumentBase()

Връща URL, от където е зареден HTML документът, който стартира аплета

getImage()

Връща манипулатор към инстанция на обект от тип Image

getParameter()

Връща параметър на аплет

getParameterInfo()

Връща описание на параметър на аплет

isActive()

Връща true, ако аплетът е активен

play()

Изпълнява аудио клип

Resize()

Променя размера на аплета

showStatus()

Показва състоянието на аплета в статус линията на браузера

Методите getParameterInfo() и getAppletInfo() дават информация на потребителя на аплет. В класа Applet те връщат празни низове и трябва да бъдат пренаписани в неговите наследници. В примерния аплет освен реализацията на тези методи са добавени и методи, даващи стойности по подразбиране на липсващи параметри.


frame6




.5Събития


Събитията представляват взаимодействия между програмата, системата и потребителя. Когато потребителят извърши някакво действие с програмата, системата генерира събитие, описващо действието и го предава на обработчика в програмата. Този обработчик определя, как ще се обработи събитието и какво ще получи в отговор потребителя. Например, когато потребителят натисне бутон, той очаква да се изпълни командата, асоциирана с бутон.

Всеки обект може да бъде уведомен за събитие (event). За това трябва да имплементира (реализира) някои интерфейси и да бъде регистриран като слушател на събития (event listener) за подходящ източник на събития (event source). В java слушателите на събития се намират в пакета java.awt.event и наследяват интерфейса EventListener. В следната таблица са дадени всички инрефейси, които наследяват EventListener, заедно с техните методи.




Слушател на събития

Методи за обработка на събития

ActionListener

public void actionPerformed(ActionEvent e);

AdjustmentListener

public void adjustmentValueChanged(AdjustmentEvent e);

AWTEventListener

public void eventDispatched(AWTEvent event);

ComponentListener

public void componentResized(ComponentEvent e);

public void componentMoved(ComponentEvent e);

public void componentShown(ComponentEvent e);

public void componentHidden(ComponentEvent e);



ContainerListener

public void componentAdded(ContainerEvent e);

public void componentRemoved(ContainerEvent e);



FocusListener

public void focusGained(FocusEvent e);

public void focusLost(FocusEvent e);



HierarchyBoundsListener

public void ancestorMoved(HierarchyEvent e);

public void ancestorResized(HierarchyEvent e);



HierarchyListener

public void hierarchyChanged(HierarchyEvent e);

InputMethodListener

void inputMethodTextChanged(InputMethodEvent event);

void caretPositionChanged(InputMethodEvent event);



ItemListener

void itemStateChanged(ItemEvent e);

KeyListener

public void keyTyped(KeyEvent e);

public void keyPressed(KeyEvent e);

public void keyReleased(KeyEvent e);


MouseListener

public void mouseClicked(MouseEvent e);

public void mousePressed(MouseEvent e);

public void mouseReleased(MouseEvent e);

public void mouseEntered(MouseEvent e);

public void mouseExited(MouseEvent e);


MouseMotionListener

public void mouseDragged(MouseEvent e);

public void mouseMoved(MouseEvent e);



TextListener

public void textValueChanged(TextEvent e);

WindowListener

public void windowOpened(WindowEvent e);

public void windowClosing(WindowEvent e);

public void windowClosed(WindowEvent e);

public void windowIconified(WindowEvent e);

public void windowDeiconified(WindowEvent e);

public void windowActivated(WindowEvent e);

public void windowDeactivated(WindowEvent e);

Всеки слушател на събития е свързан с различни събития. Всеки тип събитие се представя с отделен клас – наследник на класа Event. Класът Event e предшественик на всички събития в Java. Той съдържа константи за някои клавиши, константи за всички събития, които могат да се обработват от програмите, полета, в които съхранява информация за събитието, методи за получаване на информация за събитието.

Когато възникне събитие, то се прихваща от един или повече слушатели на събития (listeners), които реагират адекватно на него.
Източниците са обикновено компоненти, но всеки друг вид обект може да бъде източник на събития. На следващата фигура е показано, че всеки event source може да има няколко event listener-а, които са регистрирани при него. Обратно – един listener може да е регистриран за няколко източника.

.6 Реализация на обработчик на събитие (Event Handler)


  1. Създаване на клас, който наследява интерфейс-слушател на събития или клас-реализиращ такъв интерфейс.


Например public class MyClass implements ActionListener { …}


  1. В декларацията на класа, който ще прихваща събития (event handler class) трябва да се добави код, който регистрира инстанция на event listener на един или повече компоненти. Това става с метода addXXXListener, където ХХХ е типа, на събитието, за което се следи. Тогава цялата обработка на събитието се помества в класа – слушател.


Например: someComponent.addActionListener(instanceOfMyClass);


  1. Допълване на създадения клас с код, който дефинира методите на listener интерфейса. Тези методи са специфични за всеки тип слушател на събития.


Например: public void actionPerformed(ActionEvent e) {

...//код – реакция на събитието

} //Метод на EventListener интефейса
Забележка: Създаване на анонимни класове:
new ИмеНаКонструктор(параметри) {

предефиниране на методи;

}
Всеки тип компонент поддържа определени събития. Например аплетът поддържа : ContainerEvent, FocusEvent, KeyEvent, MouseEvent, ComponentEvent.

Интерфейси за слушатели на събития, които притежават повече от един метод, задължават в класа, който ги имплементира да бъдат пренаписани. Това понякога е излишно и по тази причина в пакета java.awt.event са добавени класове – адаптери за listenets – интерфейси с повече от един метод. Всеки адаптер наследява даден клас – listener и предоставя реализация по подразбиране за наследените методи. Тогава вместо класовете да наследяват интерфейсите, ние задваме техните предшественици да бъдат класове – адаптери и реализираме само методи, които желаем.

За наше щастие, когато използваме JBuilder, се възползваме от доста улеснения, които ни предоставя средата. Голяма част от кода за обработка на събития се генерира автоматично. Нека разгледаме един пример с аплет, който обработва събития пристигащи от потребителя.
frame7

Даденият аплет обработва две събития, които се подават към него. Той реагира, когато курсорът на мишката се движи в областта на аплета и когато излезе от тази област. Слушатели на събития са добавени чрез метода addMouseListener(), на който се подава като параметър инстанция на класа, който ще обработава събитията. В примера такъв обект е създаден неявно (анонимен клас) и е пренаписан само един от неговите методи. MouseAdapter и MouseMotionAdapter са класове от пакета java.awt.event, които наследяват съответно интерфейсите MouseListener и MouseMotionListener. Събитиетo, което се генерира и изпраща към аплета, е от тип MouseEvent.


Следващият пример обработва събитие, което настъпва при натискане на бутон, т.е. аплетът съдържа един компонент – бутон. За компонента бутон се регистрира слушател на събитие.
frame8

.7Упражнения


За упражнение разучете възможностите за създаване на аплети, обработващи събития, и съдържащи различни компоненти. Jbuilder предоставя удобен интерфейс за създаването им и спестява на програмиста доста време и работа. Разгледайте какви други класове съдържа пакета java.awt.event!

!За тестване на аплетите в jdk е добавена програма, наречена APPLETVIEWER. Това е малка програма, която позволява стартиране на аплети без предварително инсталиран браузер.



.8Ограничения за сигурност при аплетите


  • Аплетите са забранени за запис – не могат да пишат по твърдия диск на потребителя, както и да четат от него.

  • Аплетите не използват native методи – така би се създала възможност за пробив на сигурността. За разлика от C++ Java не позволява директен достъп до паметта.

  • Аплетите не могат да стратират или спират приложения на клиентския компютър.


AppletsEvents - 2003




База данных защищена авторским правом ©obuch.info 2016
отнасят до администрацията

    Начална страница