В настоящата тема ще разгледаме някои особености на аплетите, на начина им на изпълнение, особеностите на различните Web-браузъри и различните виртуални машини, както и някои тънкости свързани с начина на вграждане на аплети в HTML документи.
Ще продължим с един пример за използване на графичните контроли от библиотеката AWT за създаване на прозоречно-ориентиран графичен потребителски интерфейс. Ще си поставим за задача направата на прост аплет-калкулатор, с който ще илюстрираме как се използват текстови полета и бутони и как можем да прихващаме събитията, които се генерират от тях при взаимодействието им с потребителя.
Web-браузърите кешират аплетите
При разработката на аплети и при тестването им с Internet Explorer или друг Web-браузър, трябва да имаме предвид някои неща. Повечето браузъри използват кеширане на различни обекти от Web-страниците, например картинки, стилове и др. за подобряване на скоростта на зареждане на документа. Кеширането се използва и за аплетите, поради което трябва да се внимава. Записването на нова версия на аплета в директорията, от който той се зарежда и натискане на бутона “Refresh” не гарантира изпълнението на новата версия. При Internet Explorer сигурен начин за зареждането на последната версия на аплета е натискането на Ctrl+F5 или Ctrl+”Refresh”, но при други браузъри клавишните комбинации биха могли да са други. Най-сигурния начин да сме сигурни, че тестваме последната версия на разработвания аплет след промяна в кода е като го прекомпилираме, а след това затворим браузъра и го стартиране отново.
Друга важна особеност на браузърите е че повечето поддържат стандартно само много стари версии на JDK. Например Internet Explorer 4.0, 5.0 и 5.5 поддържат само JDK 1.1, какъвто е и случаят с повечето версии на Netscape Navigator. JDK 1.3, 1.4 и следващите версии се поддържат само след като се издърпа и инсталира продуктът Java Plug-In от сайта на Sun – http://java.sun.com/products/plugin/. Поради лошите отношения между Microsoft и Sun, Inetrnet Explorer 6.0 вече въобще не поддържа стандартно аплети и при него използването на Java Plug-In е задължително. Web-браузърите Netscape 6 и Mozilla 1.x също не подържат стандартно Java аплети и се нуждаят от Java Plug-In.
Поради изтъкнатите проблеми със съвместимостта когато пишем аплети трябва да използваме или JDK версия 1.1 или да изискваме потребителят да има инсталиран Java Plug-In по-висока версия.
Ако решим да използваме JDK 1.1 трябва да знаем, че повечето класове и методи, които биха ни потрябвали при писане на аплети, ги има в JDK 1.1, но имената на някои методи в различните версии на JDK са различни, въпреки че обикновено има съответствие и съвместимост отдолу нагоре. Например в java.awt.Component от JDK 1.2 е въведен метод getWidth(), а в JDK 1.1 вземането на широчината на компонент става с getSize().width.
Java конзолата и проследяването на проблеми с аплетите
При използването на липсващ метод от някой клас, виртуалната машина на браузъра предизвиква изключение. Изключения се предизвикват и при много други ситуации, които се срещат и при обикновените Java програми. Изключенията, които възникват в аплетите, както и всичко, отпечатано чрез System.out.println() можем да видим в Java конзолата на браузъра. В повечето браузъри тя е достъпна от менюто. В Internet Explorer 4.x и 5.x Java конзолата се появява в менюто “View” само след като се разреши от опциите (Internet Options | Advanced | Microsoft VM | Java console enabled) и се рестартира браузърът. Ако се използва Java Plug-In конзолата е достъпна от самия него.
Намирането на проблем в аплет без Java конзолата е почти немислимо, така че когато разработвате аплети и нещо не работи, винаги поглеждайте в нея. Типичен е случаят, в който в средата за разработка (например JBuilder, IDEA или Eclipse) аплетите работят, а в браузъра не тръгват. Причините могат да са две – или има разлика във версиите на JDK в средата за разработка и поддържаната в браузъра или аплетът се опитва да извърши нещо за което няма права.
Обикновено appletviewer или средата за разработка стартират аплетите с повече права, отколкото един браузър би им дал и с JDK, по-висока версия от 1.1 и затова се получават несъвместимости.
Пример за аплет-калкулатор
Нека сега дадем още един пример за аплет, с който да демонстрираме работа с компонентите на AWT и обработката на събитията, възникнали в резултат от действията на потребителя. Да си поставим за задача реализацията на прост калкулатор, който събира числа. Трябват ни две полета за двете събираеми, още едно поле за резултата и един бутон за събиране. За демонстрация на работата с шрифтове ще добавим в нашия аплет-калкулатор заглавен текст със сянка. За демонстрация на работата със събития от мишката при щракване върху аплета цветът му ще се променя, а при отпускане бутона на мишката ще се възстановява обратно. Ето една примерна реализация на такъв аплет:
SumatorApplet.java
import java.awt.*;
import java.awt.event.*;
import java.applet.*;
publicclass SumatorApplet extends Applet {
private TextField mNumber1Field = new TextField();
private TextField mNumber2Field = new TextField();
В инициализационната част на аплета първо се задава стойност null за Layout Manager. Layout Manager-ът служи за подреждане на AWT компонентите в един AWT контейнер и може да е много полезен при създаване на форми, които могат да променят размерите си. В случая искаме да работим с абсолютни координати и размери на компонентите, а не с размери и координати, определени от Layout Manager-а и затова задаваме за LayoutManager стойност null, понеже по подразбиране тази стойност е друга.
Като следваща стъпка създаваме компонентите на аплета една по една – първото текстово поле, второто текстово поле и накрая бутона.
За да прихванем събитието “натискане на бутона за сумиране”, използваме методът addActionListener, който приема като параметър обект от клас, който имплементира интерфейса ActionListener. За спестяване на някои неудобства използваме дефиниция на място на анонимен клас, който реализира ActionListener интерфейса и в метода за натискане на бутон actionPerformed() извиква метода за изчисляване на сумата calcSum().
За прихващане на събитията от мишката има два начина. Единият, който ние сме използвали е да се припокрият методите MouseDown(), MouseUp() и т.н. на базовия клас, а другият е да се добави MouseListener чрез метода addMouseListener() по начин подобен на този с добавянето на ActionListener.
Процедурата за пресмятане на резултата взима стойностите от двете текстови полета, превръща ги в числа и показва резултата от събирането в полето за резултата. Ако не успее при превръщането текста от полетата в числа или ако се случи препълване или някаква друга грешка, резултатът е “Error!”.
За демонстрация на работата с шрифтове в метода paint() се отпечатва текст със сянка. Важно е методът paint() да извиква paint() метода на базовия си клас (super.paint()), за да могат компонентите, добавени в аплета да се пречертават всеки път, когато аплетът се пречертава. В нашата реализация на paint() метода след извикването на базовия paint() метод, чертането продължава със задаване на шрифта и цвета на текста и отпечатването му. След това цветът се сменя и се отпечатва същия текст, изместен с 2 позиции нагоре и наляво. Така се създава впечатлението за сянка.
Нашият аплет има още една интересна възможност – може да работи и като самостоятелна програма. За целта той има main() метод, в който се създава инстанция на аплета и един обект java.awt.Frame, в който се той се поставя, задават му се размерите и се показва на екрана. Така аплетът може да бъде стартиран за тестови цели като самостоятелна програма, а когато е готов, може да се тества и в браузъра, защото, както знаете аплетите се държат по различен начин в различните среди, в които се стартират.
Изпълнение на аплета-калкулатор
Ето примерен HTML код, с който може да се стартира аплета:
TestSumatorApplet.html
<html><body><center>
<appletcode="SumatorApplet.class"codebase="."
width="280"height="130">
applet>
center>body>html>
Забележете параметъра codebase=".", с който се задава пътя до директорията, в която се намира .class файла на аплета. Без него аплетът не може да се изпълни, защото реално се състои от повече от един .class файлове.
Ето как изглежда нашият аплет в браузъра Mozilla:
Тагът има и други интересни параметри, като например archive="SomeArchive.jar", с който може да се зададе пътя и името на JAR архив, който съдържа класовете на аплета.
Използване на JAR архиви
За да демонстрираме използването на JAR архиви ще компилираме и пакетираме в JAR архив .class файловете на аплета SumatorApplet. Ето един пример как може да стане това:
compile_sumator_applet.cmd
del *.class
javac SumatorApplet.java
del SumatorApplet.jar
jar -cvf SumatorApplet.jar *.class
Изпълняването на аплета от JAR файла може да стане със следния HTML код:
Преди да изясним ситуацията с правата на аплетите, трябва да отбележим, че в новите версии на JDK след 1.1 съществува стандартно разширение на библиотеката AWT, което се нарича Swing и представлява съвкупност от класове за създаване на прозоречно-ориентиран графичен потребителски интерфейс, които се намират в пакета javax.swing.
Ние няма да разглеждаме библиотеката Swing, но тези от вас, които искат да я използват, трябва да знаят, че тя изисква инсталиран Java Plug-In версия 1.2 или по-висока.
Таговете
Досега в нашите примери за да изпълним аплет използвахме тага . Въпреки, че това е най-лесният начин да вградим аплет в дадена HTML страница, той не е много препоръчителен. Проблемът на тага е, че при него не може да се укаже коя версия на JDK изисква аплетът за да работи нормално. Друг проблем е, че ако браузърът не поддържа аплети, потребителят въобще няма да бъде уведомен за това и няма да бъде автоматично помолен да си инсталира Java Plug-In.
За решаването на тези проблеми могат да бъдат използвани таговете в Internet Explorer и във всички останали браузъри. В тях може да се укаже минималната версия на JDK, която е необходима на аплета, както и от къде може да бъде изтеглен Java Plug-In ако такъв няма на машината на клиента. Понеже Internet Explorer не разбира тага , а останалите браузъри не разбират тага , е необходимо тези два тага да се комбинират, за да се направи аплетът да работи в средата на всички популярни Web-браузъри като се съобразява с поисканата версия. Ето един пример как може да стане това:
BallAppletNewTest.html
<html>
<head><title>Ball Applet – New Test Pagetitle>head>
При зареждане на тази страница в Internet Explorer, ако на машината няма инсталиран Java Plug-In, той се издърпва автоматично, като ActiveX контрола и след потвърждение от потребителя се инсталира. При други браузъри инсталирането на Java Plug-In (ако го няма или е много стара версия) не става автоматично, но браузърът се пренасочва автоматично към страницата за изтеглянето му.
Не е необходимо за знаете точния синтаксис на тези тагове, защото за автоматичното преобразуване на тага към по-новите тагове стандартно към JDK 1.4 има включена специална помощна програмка HtmlConverter.exe, която е достъпна от bin директорията на JDK. С нея лесно можете да преобразувате тага към по-сложни тагове за извикване на аплет, които са съобразени с различни Web-браузъри.