Партнерка на США и Канаду по недвижимости, выплаты в крипто

  • 30% recurring commission
  • Выплаты в USDT
  • Вывод каждую неделю
  • Комиссия до 5 лет за каждого referral

ЛЕКЦИЯ Java-апплеты

Пришло время заняться Web-программированием, т. е. тем, ради чего и была задумана данная книга. У вас уже есть некоторый опыт создания Web-страниц. Документы, построенные нами в качестве примеров, содержали текст, изображения, гипертекстовые ссылки, однако в них недоставало программ. Сейчас мы восполним этот недостаток, и вскоре на вашей Web-странице появится первый исполняемый фрагмент кода. Первая программа будет крайне простой, и это вполне естественно, ведь главная ее задача состоит не в том, чтобы реализовать сложный алгоритм обработки, а в том, чтобы продемонстрировать, как выполняется программный код в новой среде — на виртуальной машине, предоставленной браузером.

Надеюсь, что основы программирования на Java вам уже известны. Если это не так — обратитесь к В нем приведены сведения, необходимые для того, чтобы понять, как работает несложный апплет.

Ваш первый апплет

Ниже приведен пример простейшего апплета, написанного на языке Java. Действия, выполняемые им, не очень впечатляют постороннего наблюдателя. Скажем больше — они примитивны и сводятся к выводу в окне браузера строки текста. Однако даже такой простой апплет обладает рядом особенностей, которые необходимо внимательно рассмотреть.

import java. awt.*;

import java. applet.*;

public class FirstApplet extends Applet

{

public void paint( Graphics g )

{

g. drawString ("Мой первый апплет", 50, 100 );

}

}

Исходный код апплета начинается с операторов import, импортирующих классы, содержащиеся в пакетах java. awt и Java. applet. В пакете Java. applet нас интересует лишь класс Applet, а в пакете java. awt — класс Graphics, поэтому мы вполне могли бы записать данные выражения следующим образом:

НЕ нашли? Не то? Что вы ищете?

import java. awt. Graphics;

import java. applet. Applet;

Чтобы при последующих модификациях программы не приходилось вносить изме­нения, мы импортируем все содержимое пакетов Java. applet и java. awt.

Далее следует определение класса FirstApplet, который является подклассом класса Applet. Имя создаваемого класса выбрано произвольно. К классу, реализующему апплет, предъявляется единственное требование: его суперклассом должен быть класс Applet.

В классе FirstApplet определяется (вернее, переопределяется) единственный метод paint(), которому при вызове предается экземпляр класса Graphics. Именно для работы с этим классом нам и потребовалось импортировать пакет java. awt. В теле метода paint() вызывается метод drawString() класса Graphics. О назначении метода drawString() можно догадаться по его названию: он выводит символьную строку в окне апплета. В качестве первого параметра задается строка (экземпляр класса String), предназначенная для вывода, второй и третий параметр — это координаты Х и Y в окне апплета, начиная с которых должна выводиться указанная строка.

Имея готовый текст апплета, необходимо решить два вопроса.

• Как сгенерировать байтовый код апплета?

• Как включить апплет в состав Web-страницы?

Чтобы получить байтовый код, пригодный для интерпретации виртуальной машиной Java, исходный код апплета надо скомпилировать. Для компиляции используем программу javac, входящую в состав JDK.

"Почему именно JDK? — спросите вы — Ведь существует множество специализированных инструментов для разработки Java-приложений и апплетов!" Дело именно в том, что продуктов, предназначенных для создания Java-программ и предоставляющих разработчику графический интерфейс, слишком много, и нет никаких оснований отдавать предпочтение одному из них. Чтобы не навязывать конкретное средство разработки (выбор инструмента для работы — личное дело каждого программиста), для построения байтового кода апплета используется "классический" компилятор, поставляемый в составе JDK.

Команда, используемая для компиляции, имеет следующий вид:

javac PirstApplet. java

Если при вводе исходного текста не были допущены ошибки, в результате выполнения данной команды будет сгенерирован файл FirstApplet. class, содержащий байтовый код апплета.

А что произойдет, если исходный код апплета хранится в файле с другим именем? В этом случае компилятор отобразит следующее сообщение об ошибке:

FirstAppl. java:8: Public class FirstApplet must be defined in a file called

"FirstApplet. Java".

public class FirstApplet extends Applet

1 error

Как видно из исходного кода апплета, при определении класса FirstApplet указан модификатор public, т. е. данный класс доступен для объектов вне пакета. В этом случае имя файла должно совпадать с именем класса.

Включение апплета в состав Web-страницы

Итак байтовый код апплета готов и хранится в файле FirstApplet. class. Как же за­пустить файл на выполнение? Чтобы запустить апплет, его надо включить в состав Web-страницы (он также может выполняться под управлением специального эмулятора, однако мы не будем рассматривать этот способ). Пример HTML-кода страницы, содержащей апплет, приведен ниже:

<HTML>

<HEAD>

<ТIТLЕ>Первый апплет</ТIТLЕ>

</HEAD>

<BODY>

<Н2>Апплет на НеЬ-странице</Н2><Р>

<APPLET CODE = "FirstApplet. class" WIDTH = 300 HEIGHT = 250>

</APPLET>

</BODY>

</HTML>

Для включения апплета в состав Web-страницы используется дескриптор <APPLET>. Для него предусмотрено несколько атрибутов. Три атрибута, CODE, WIDTH и HEIGHT, обязательны, остальные указывать не обязательно. Значением атрибута CODE является имя файла, содержащего апплет. Атрибуты WIDTH и HEIGHT задают ширину и высоту окна апплета в пикселях.

Назначение остальных атрибутов дескриптора <APPLET> приведено ниже.

CODEBASE = URL, - указывается в том случае, если апплет и HTML-документ, в состав которого он входит, хранятся в различных каталогах. Значением атрибута CODEBASE является URL каталога, в котором содержится апплет.

ALT = строка - значением этого атрибута является строка символов. Она отображается на экране в том случае, если браузер по каким-либо причинам не может отобразить апплет. Данный атрибут выполняет те же функции, что и одноименный атрибут дескриптора <IMG>.

ALIGN = тип_выравнивания - управляет выравниванием окна апплета. Значения данного атрибута имеют тот же смысл, что и значения атрибута ALIGN дескриптора <IMG>.

VSPACE и HSPACE - подобно дескриптору <IMG>, эти атрибуты задают размер свободной области над и под апплетом, а также по бокам от него.

NAME = имя - позволяет именовать апплет. Апплетам, как и другим компонентам Web-страницы, могут присваиваться имена.

При запуске апплету, включенному в состав Web-страницы, можно передавать параметры. Для этого надо воспользоваться дескриптором <PARAM>. Параметры определяются с помощью атрибутов NAME и VALUE данного дескриптора.

NAME = имя — задает имя параметра.

VALUE = имя — задает значение параметра.

Как имя, так и значение представляют собой строки символов. Дескрипторы <PARAM> размещаются между открывающим и закрывающим дескрипторами <APPLET> ... </APPLET>.

Цвет фона окна апплета может совпадать с цветом фона окна браузера. Далее в этой главе вы узнаете, как задать цвет окна апплета в явном виде, не оставляя браузеру свободы выбора.

Итак, апплет скомпилирован и включен в состав Web-страницы, однако структура апплета пока еще не совсем ясна. Вопросы, которые вы, по-видимому, готовы задать, касаются методов класса FirstApplet. Почему единственный метод, описанный в исходном тексте, называется paint()? Почему ему передается экземпляр класса Graphics? Можно ли и надо ли использовать другие методы? Все приведенные вопросы, по сути, сводятся к одному: "Как выполняется апплет?" Ответом на него станет следующий раздел.

Выполнение апплета

В процессе выполнения апплет последовательно проходит через следующие состояния.

Инициализация (вызов метода init()). В процессе работы апплета инициализация производится лишь один раз, поэтому на данном этапе необходимо принять все необходимые меры по подготовке программы к дальнейшей работе.

Запуск (вызов метода start()). Метод start() может вызываться неоднократно. Первый раз он вызывается после завершения метода init(). Кроме того, он может вызываться при возобновлении работы апплета после временной остановки.

Перерисовка окна апплета (вызов метода paint()). Необходимость в перерисовке возникает, когда размеры окна изменяются, когда окно минимизируется, а затем восстанавливается, когда окно временно перекрывается другим окном, а также в некоторых других случаях. Именно в теле этого метода мы выполняли вывод строки символов.

Остановка (вызов метода stop()). Обычно выполнение апплета приостанавливается в тех случаях, когда окно браузера, в котором отображается Web-страница, содержащая апплет, становится неактивным. При этом вызывается метод stop(). Если пользователь снова активизирует окно с апплетом, работа апплета возобновляется, при этом вызывается метод start().

Удаление апплета из памяти (вызов метода destroy()). На этом этапе работа апплета окончательно завершается.

Как вы, вероятно, догадались, все упомянутые выше методы определены в классе Applet. При построении подкласса класса Applet разработчик может переопределить некоторые из них, как мы сделали это с методом paint(). Как показывает опыт, при написании апплетов разработчики редко переопределяют методы start(), stop() и destroy(). Как правило, изменения вносятся в методы init() и paint().

В классе Applet определены и другие методы, кроме пяти, перечисленных выше. Чтобы определить, какие средства доступны в классе Applet и его подклассах, рассмотрим фрагмент иерархии классов Java, имеющий отношение к классу Applet.

Object

!

!— Component

!

!— Container

!

! — Panel

!

!— Applet

Как видно из приведенной выше диаграммы, класс Applet является подклассом класса Panel. Выше Panel в иерархии классов находятся абстрактные классы Container, Component и, конечно же. Object. Соответственно класс Applet позволяет обращаться к общедоступным методам, определенным как в нем, так и в его суперклассах. Некоторые из методов класса Applet и его суперклассов перечислены ниже.

URL getCodeBase() — возвращает URL каталога, содержащего байтовый код апплета.

URL getDocumentBase() — возвращает URL HTML-документа, включающего данный апплет.

String GetParameter(String имя_параметра) — возвращает значение параметра с указанным именем.

boolean isActive() — возвращает значение true, если апплет активен. На первый взгляд использование данного метода в составе апплета может показаться бессмысленным, однако следует учесть, что апплет перестает быть активным после вызова метода stop() и снова активизируется после вызова метода start().

void ShowStatus(String сообщение) — выводит сообщение, заданное в качестве параметра, в строке состояния браузера.

void play(URL аудиоклип) — воспроизводит аудиоклип, указанный в качестве параметра.

void SetBackground (Color цвет) — устанавливает цвет фона. Данный метод определен в классе Component.

void SetForeground (Color цвет) — устанавливает цвет переднего плана. Как и предыдущий метод, SetForeground() определен в классе Component.

void repaint() — данный метод определен в классе Component и вызывает пере­рисовку соответствующего компонента.

void show() — данный метод также определен в классе Component. Он отображает соответствующий компонент.

Используем некоторые из приведенных выше методов для модификации созданного нами апплета. В первую очередь зададим явно цвет фона. Исходный текст апплета имеет следующий вид:

import java. awt.*;

import java. applet.*;

public class FirstApplet extends Applet {

public void init() {

SetBackground(Color. gray);

}

public void paint(Graphics g) {

g. drawstring("Мой первый апплет", 50, 100);

}

}

Как видите, в составе апплета появился метод init(), в теле которого содержится следующая строка:

SetBackground(Color.white);

Метод SetBackground(), определенный в классе Component, задает цвет фона компонента; в данном случае компонентом является окно апплета. При вызове метода указывается единственный параметр — константа (переменная final static) класса Color, которая определяет требуемый цвет.

Отображая Web-страницу, содержащую данный апплет, вы увидите, что он генерирует изображение. Однако, независимо от используемого браузера, цвет фона будет серым.

Класс Graphics, экземпляр которого передается при вызове метода paint(), не только дает возможность отображать в окне апплета символы, но и позволяет легко вы­водить графические изображения. Ниже приведен исходный текст апплета, отображающего простую картинку, созданную средствами векторной графики.

mport java. awt.*;

import java. applet.*;

public class SecondApplet extends Applet {

public void init() {

setBackground (Color. white);

}

public void paint( Graphics g ) {

g. drawLine(100, 100, 200, 100);

g. drawLine(200, 100, 200, 200);

g. drawLine(200, 200, 100, 200);

g. drawLine(100, 200, 100, 100);

g. drawLine(100, 100, 150, 50);

g. drawLine(150, 50, 250, 50);

g. drawLine(200, 100, 250, 50);

g. drawLine(250, 50, 250, 150);

g. drawLine(250, 150, 200, 200);

}

}

События

Несмотря на то, что представленные выше апплеты работоспособны и выполняют некоторые, хотя и несложные действия, в них недостает главного — средств взаимодействия с пользователем. Действительно, что делают рассмотренные апплеты? Их функции сводятся к выводу текста и изображений. Но того же эффекта можно добиться средствами HTML, не запуская сложный механизм интерпретации байтового кода. Если же мы включаем в состав Web-страницы исполняемые фрагменты, то дела­ем это лишь для того, чтобы Web-страница реагировала на действия пользователей.

Как правило, орудия воздействия пользователя на киберпространство ограничиваются клавиатурой и мышью. Эпоха сенсорных костюмов виртуальной реальности еще не наступила, а графические планшеты или указатели типа Joystick — слишком специфические устройства, чтобы уделять им внимание на первых этапах изучения Web-программирования.

Действия пользователя являются для апплета внешними событиями. Каждое событие соответствует определенному действию. Казалось бы, если перечень доступных операций с физическими устройствами ограничен, то набор событий также окажется невелик. Однако, это не так. Дело в том, что реакция апплета может определяться не только действием пользователя, но и состоянием апплета в момент выполнения этого действия. Поэтому события, обрабатываемые апплетом, делятся на две категории.

• Простые события.

• События пользовательского интерфейса.

Простые события возникают в результате таких действий пользователя, как нажатие клавиши, перемещение курсора мыши, нажатие или отпускание кнопки мыши. Событиями пользовательского интерфейса считаются те же самые действия пользователя, но при этом учитывается состояние управляющих элементов. Так, например, щелчок мышью в окне апплета генерирует два простых события, соответствующих нажатию и отпусканию кнопки. Тот же щелчок мышью на кнопке, отображаемой в окне апплета, генерирует событие пользовательского интерфейса.

В данном разделе речь пойдет о простых событиях. События пользовательского интерфейса будут рассмотрены далее в этой главе. Однако и на этом рассказ о событиях не окончится.

Для обработки простых событий в классе Applet предусмотрены следующие методы.

boolean mouseDown(Event e, int x, int у) — вызывается при нажатии кнопки мыши.

boolean mouseUp(Event e, int x, int у) — вызывается при отпускании кнопки мыши.

boolean mouseEnter(Event e, int x, int у) — вызывается при попадании курсора мыши в пределы окна апплета.

boolean mouseExit(Event e, int x, int у) — вызывается в том случае, когда курсор мыши выходит за границы окна апплета.

boolean mouseMove(Event e, int x, int у) — вызывается при перемещении курсора мыши.

boolean mouseDrag(Event e, int x, int у) — вызывается, если курсор мыши перемещается при отпущенной кнопке.

boolean keyDown(Event e, int key) — вызывается при нажатии клавиши на клавиатуре.

boolean keyUp(Event e, int key) — вызывается при отпускании нажатой клавиши.

Методам, вызываемым в результате действий с мышью, в качестве параметров передаются экземпляр класса Event, описывающего конкретное событие, а также координаты х и у курсора мыши в момент возникновения события. Методы, поддерживающие действия с клавиатурой, получают при вызове экземпляр класса Event и код нажатой клавиши.

Каждый из перечисленных методов возвращает логическое значение. Если метод возвращает true, считается, что обработка события окончена; значение false предполагает дальнейшую обработку.

Ниже приведен исходный текст простого апплета, демонстрирующего обработку не­которых событий.

import java. awt.*;

import Java. applet.*;

public class Mouse extends Applet {

int pos_x, pos_y;

public void paint(Graphics g) {

g. drawString("X=" + pos_x + " Y=" + pos_y, pos_x, pos_y);

}

public boolean mouseDown(Event ev, int x, int y) {

showStatus("X=" + pos_x + " Y=" + pos_y);

return true;

}

public boolean mouseMove(Event ev, int x, int y) {

pos_x = x;

pos_y = y;

repaint();

return true;

}

}

При перемещении курсора мыши текущие координаты отображаются в окне апплета. При каждом изменении текущей позиции указателя мыши вызывается метод mouseMove(). В теле этого метода происходит копирование координат х и у в переменные pos_x и pos, затем вызывается метод repaint(), в результате чего отображается новое состояние окна браузера. Метод mouseMove() возвращает значение true, сообщая тем самым, что обработка события полностью окончена.

В методе mouseDown() значения координат, хранящиеся в переменных pos_x и pos_y, отображаются в строке состояния браузера; для этого в теле метода вызывается showStatus().

Если вы сохраните исходный код данного апплета в файле MouseJava и попытаетесь скомпилировать его, вас ожидает неприятный сюрприз. В ответ на команду javac Mouse.Java компилятор выводит следующее сообщение:

Note: Mouse. Java uses a deprecated API. Recompile with "-deprecation" for details.

1 warning

Указав при вызове команды опцию -deprecation, вы получите более подробное сообщение. Из него следует, что причиной недовольства компилятора является использование методов mouseMove() и mouseDown(). Тем не менее компилятор создает вполне работоспособный байтовый код апплета.