Национална академия по разработка на софтуер


Особености на аплетите и работата с AWT



страница12/14
Дата25.07.2016
Размер2.68 Mb.
#6706
1   ...   6   7   8   9   10   11   12   13   14

1.9.Особености на аплетите и работата с AWT


В настоящата тема ще разгледаме някои особености на аплетите, на начина им на изпълнение, особеностите на различните Web-браузъри и различните виртуални машини, както и някои тънкости свързани с начина на вграждане на аплети в HTML документи.

Ще продължим с един пример за използване на графичните контроли от библиотеката AWT за създаване на прозоречно-ориентиран графичен потребителски интерфейс. Ще си поставим за задача направата на прост аплет-калкулатор, с който ще илюстрираме как се използват текстови полета и бутони и как можем да прихващаме събитията, които се генерират от тях при взаимодействието им с потребителя.


Web-браузърите кешират аплетите


При разработката на аплети и при тестването им с Internet Explorer или друг Web-браузър, трябва да имаме предвид някои неща. Повечето браузъри използват кеширане на различни обекти от Web-страниците, например картинки, стилове и др. за подобряване на скоростта на зареждане на документа. Кеширането се използва и за аплетите, поради което трябва да се внимава. Записването на нова версия на аплета в директорията, от който той се зарежда и натискане на бутона “Refresh” не гарантира изпълнението на новата версия. При Internet Explorer сигурен начин за зареждането на последната версия на аплета е натискането на Ctrl+F5 или Ctrl+”Refresh”, но при други браузъри клавишните комбинации биха могли да са други. Най-сигурния начин да сме сигурни, че тестваме последната версия на разработвания аплет след промяна в кода е като го прекомпилираме, а след това затворим браузъра и го стартиране отново.

Java виртуалната машина при различните Web-браузъри


Друга важна особеност на браузърите е че повечето поддържат стандартно само много стари версии на 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.*;

public class SumatorApplet extends Applet {

private TextField mNumber1Field = new TextField();

private TextField mNumber2Field = new TextField();

private Button mCalcButton = new Button();

private TextField mSumField = new TextField();

private Color mLastBackgroundColor;

public void init() {

this.setBackground(Color.black);

// Set layout manager to null

this.setLayout(null);

// Create the first text field

mNumber1Field.setBounds(new Rectangle(20, 50, 60, 25));

mNumber1Field.setBackground(Color.white);

this.add(mNumber1Field, null);

// Create the second text field

mNumber2Field.setBounds(new Rectangle(95, 50, 60, 25));

mNumber2Field.setBackground(Color.white);

this.add(mNumber2Field, null);

// Create the "calculate sum" button

mCalcButton.setBounds(new Rectangle(170, 50, 90, 25));

mCalcButton.addActionListener(

new ActionListener() {

public void actionPerformed(ActionEvent e) {

calcSum();

}

});


mCalcButton.setLabel("calc sum");

this.add(mCalcButton, null);

// Create the result text field

mSumField.setEditable(false);

mSumField.setBackground(Color.gray);

mSumField.setForeground(Color.white);

mSumField.setBounds(new Rectangle(20, 85, 240, 25));

this.add(mSumField, null);

}

public boolean mouseDown(Event aEvent, int aX, int aY) {

mLastBackgroundColor = this.getBackground();

this.setBackground(Color.red);

return true;

}

public boolean mouseUp(Event aEvent, int aX, int aY) {



this.setBackground(mLastBackgroundColor);

return true;

}

private void calcSum() {



try {

long s1 = new Long(mNumber1Field.

getText()).longValue();



long s2 = new Long(mNumber2Field.

getText()).longValue();

mSumField.setText(s1 + " + " + s2 + " = " +

(s1+s2));

} catch (Exception ex) {

mSumField.setText("Error!");

}

}

public void paint(Graphics aGraphics) {



super.paint(aGraphics);

Font font = new Font("Dialog", Font.BOLD, 23);

aGraphics.setFont(font);

aGraphics.setColor(Color.gray);

aGraphics.drawString("Test sumator applet", 20, 32);

aGraphics.setColor(Color.white);

aGraphics.drawString("Test sumator applet", 18, 30);

}

public static void main(String[] aArgs) {

Frame frame = new Frame("Sumator");

frame.setSize(280,160);

SumatorApplet applet = new SumatorApplet();

applet.init();

frame.add(applet);

frame.setVisible(true);

applet.start();

}

}


Как работи аплетът-калкулатор


В инициализационната част на аплета първо се задава стойност 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>

<applet code="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 код:

TestSumatorApplet-JAR.html

<html><body><center>

<applet code="SumatorApplet.class" archive="SumatorApplet.jar"

width="280" height="130">

applet>

center>body>html>

Библиотеката Swing


Преди да изясним ситуацията с правата на аплетите, трябва да отбележим, че в новите версии на 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>

<body>

<object classid="clsid:8AD9C840-044E-11D1-B3E9-00805F499D93" codebase="http://java.sun.com/products/plugin/autodl/jinstall-1_4-windows-i586.cab#Version=1,4,0,0" width="200" height="150">

<param name="code" value="BallApplet.class">

<param name="type" value="application/x-java-applet;version=1.4">

<param name="imageName" value="ball.jpg">

<comment>

<embed type="application/x-java-applet;version=1.4"

code="BallApplet.class" width="200" height="150"

imageName="ball.jpg" pluginspage="http://java.sun.com/products/plugin/index.html#download">

<noembed>

Applet can not be started because

Java Plug-In 1.4 is not installed.

noembed>

embed>

comment>

object>
body>

html>


При зареждане на тази страница в Internet Explorer, ако на машината няма инсталиран Java Plug-In, той се издърпва автоматично, като ActiveX контрола и след потвърждение от потребителя се инсталира. При други браузъри инсталирането на Java Plug-In (ако го няма или е много стара версия) не става автоматично, но браузърът се пренасочва автоматично към страницата за изтеглянето му.

Не е необходимо за знаете точния синтаксис на тези тагове, защото за автоматичното преобразуване на тага към по-новите тагове стандартно към JDK 1.4 има включена специална помощна програмка HtmlConverter.exe, която е достъпна от bin директорията на JDK. С нея лесно можете да преобразувате тага към по-сложни тагове за извикване на аплет, които са съобразени с различни Web-браузъри.



Каталог: books -> inetjava
books -> В обятията на шамбала
books -> Книга се посвещава с благодарност на децата ми. Майка ми и жена ми ме научиха да бъда мъж
books -> Николай Слатински “Надеждата като лабиринт” София, Издателство “виденов & син”, 1993 год
books -> София, Издателство “Българска книжница”, 2004 год. Рецензенти доц д. ик н. Димитър Йончев, проф д-р Нина Дюлгерова Научен редактор проф д-р Петър Иванов
books -> Николай Слатински “Измерения на сигурността” София, Издателство “Парадигма”, 2000 год
books -> Книга 2 щастие и успех предисловие
books -> Превръщане на числа от една бройна система в друга
books -> Тантриското преобразяване


Сподели с приятели:
1   ...   6   7   8   9   10   11   12   13   14




©obuch.info 2024
отнасят до администрацията

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