вия мыши и клавиатуры. В окне должны быть, как минимум, следующие стандартные компоненты.
· Строка заголовка (titlebar), с левой стороны которой необходимо разместить кнопку контекстного меню, а с правой — кнопки сворачивания и разворачивания окна и кнопку закрытия приложения.
· Необязательная строка меню (menubar) с выпадающими пунктами меню.
· Горизонтальная и вертикальная полосы прокрутки (scrollbars).
· Окно должно быть окружено рамкой (border), реагирующей на действия мыши.
Окно с этими компонентами в готовом виде описано в классе Frame. Чтобы создать окно, достаточно сделать свой класс расширением класса Frame, как показано в листинге 8.1. Всего восемь строк текста и окно готово.
Глава 4 Апплеты
4.1 Апплеты
Кроме приложений, язык Java позволяет создавать апплеты (applets). Это программы, работающие в среде другой программы — браузера. Апплеты не нуждаются в окне верхнего уровня — им служит окно браузера. Они не запускаются JVM — их загружает браузер, который сам запускает JVM для выполнения апплета. Эти особенности отражаются на написании программы апплета.
С точки зрения языка Java, апплет — это всякое расширение класса Applet, который, в свою очередь, расширяет класс panel. Таким образом, апплет — это панель специального вида, контейнер для размещения компонентов с дополнительными свойствами и методами. Менеджером размещения компонентов по умолчанию, как и в классе Panel, служит FiowLayout. Класс Applet находится в пакете java. applet, в котором кроме него есть только три интерфейса, реализованные в браузере. Надо заметить, что не все браузеры реализуют эти интерфейсы полностью.
Поскольку JVM не запускает апплет, отпадает необходимость в методе main (), его нет в апплетах.
В апплетах редко встречается конструктор. Дело в том, что при запуске первого создается его контекст. Во время выполнения конструктора контекст еще не сформирован, поэтому не все начальные значения удается определить в конструкторе.
Начальные действия, обычно выполняемые в конструкторе и методе mamo, в апплете записываются в метод inito класса Applet. Этот метод автоматачески запускается исполняющей системой Java браузера сразу же после загрузки апплета. Вот как он выглядит в исходном коде класса Applet:
publicvoidinit(){}
Негусто! Метод init () не имеет аргументов, не возвращает значения и должен переопределяться в каждом апплете — подкласре класса Applet. Обратные действия — завершение работы, освобождение ресурсов — записываются при необходимости в метод destroy о, тоже выполняющийся автоматически при выгрузке апплета. В классе Applet есть пустая реализация этого метода.
Кроме методов init() и destroy() в классе Applet присутствуют еще два пустых метода, выполняющихся автоматически. Браузер должен обращаться к методу start() при каждом появлении апплета на экране и обращаться к методу stop(), когда апплет уходит с экрана. В методе stop() можно определить действия, приостанавливающие работу апплета, в методе start() — возобновляющие ее. Надо сразу же заметить, что не все браузеры обращаются к этим методам как должно.
4.2 Параметры тега <applet>
Перечислим все параметры тега <appiet>.
Обязательные параметры:
· 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 (CascadingStyleSheet); title — текст, отображаемый в процессе выполнения апплета;
· alt — текст, выводимый вместо апплета, если браузер не может загрузить его;
· mayscript — не имеет значения. Это слово указывает на то, что апплет будет обращаться к тексту JavaScript.
Метод getCodeBase () возвращает URL-адрес каталога, в котором лежит файл класса апплета.
4.3 Сведения об окружении апплета
Метод getoocumentBase () возвращает URL-адрес каталога, в котором лежит HTML-файл, вызвавший апплет.
Браузер реализует интерфейс Appletcontext, находящийся в пакете java.applet. Апплет может получить ссылку на этот интерфейс методом getAppletContext().
С помощью методов getApplet (Stringname) и getApplets() интерфейса Appletcontext можно получить ссылку на указанный аргументом name апплет или на все апплеты, загруженные в браузер.
Метод showDocument(URLaddress) загружает в браузер HTML-файл с адреса address.
Метод showDocument (URLaddress, Stringtarget) загружает файл во фрейм, указанный вторым аргументом target. Этот аргумент может принимать следующие значения:
· _seif — то же окно и тот же фрейм, в котором работает апплет;
· _parent — родительский фрейм апплета;
· _top — фрейм верхнего уровня окна апплета;
· _biank — новое окно верхнего уровня;
· name — фрейм или окно с именем name , если оно не существует, то будет создано.
4.4 Изображение и звук
Изображение в Java — это объект класса image, представляющий прямоугольный массив пикселов. Его могут показать на экране логические методы drawimageo класса Graphics. Мы рассмотрим их подробно в следующей главе, а пока нам понадобятся два логических метода:
drawlmage(Image img, int x, int y, ImageObserver obs)
drawImage(Image img, int x, int y, int width, int height,
ImageObserverobs)
Методы начинают рисовать изображение, не дожидаясь окончания загрузки изображения img. Более того, загрузка не начнется, пока не вызван метод drawlmage(). Методы возвращают false, пока загрузка не закончится.
Аргументы (х, у) задают координаты левого верхнего угла изображения img; width и height — ширину высоту изображения на экране; obs — ссылку на объект, реализующий интерфейс ImageObserver, следящий за процессом загрузки изображения. Последнему аргументу можно дать значение this.
Первый метод задает на экране такие же размеры изображения, как и у объекта класса image, без изменений. Получить эти размеры можно методами getWidth(), getHeight{) класса Image.
Интерфейс ImageObserver, реализованный классом Component, а значит, и классом Applet, описывает только один логический метод imageUpdate (), выполняющийся при каждом изменении изображения. Именно этот метод побуждает перерисовывать компонент на экране при каждом его изменении.
Апплеты были первоначальным практическим применением Java. За первые два года существования Java были написаны тысячи очень интересных и красивых апплетов, ожививших WWW. Масса апплетов разбросана по Internet, хорошие примеры апплетов собраны в JDK в каталоге demo\applets.
В JDK вошел целый пакет java.applet, в который фирма SUN собиралась заносить классы, развивающие и улучшающие апплеты.
С увеличением скорости и улучшением качества компьютерных сетей значение апплетов сильно упало. Теперь вся обработка данных, прежде выполняемая апплетами, переносится на сервер, браузер только загружает и показывает результаты этой обработки, становится "тонким клиентом".
С другой стороны, появилось много специализированных программ, в том числе написанных на Java, загружающих информацию из Internet. Такая возможность есть сейчас у всех музыкальных и видеопроигрывателей.
Фирма SUN больше не развивает пакет java.applet. В нем так и остался один класс и три интерфейса. В библиотеку Swing вошел класс JApplet, расширяющий класс Applet. В нем есть дополнительные возможности, например, можно установить систему меню. Он способен использовать все классы библиотеки Swing. Но большинство браузеров еще не имеют Swing в своем составе, поэтому приходится загружать классы Swing с сервера или включать их в jar-архив вместе с классами апплета.
1. Учебник по JBuilder
2. Borland® JBuilder™ Developer's Guide
Приложение
// реализация класса CircleClock
packageclock;
/*
* CircleClock.java
*
* Createdon май 2009 г.
*/
importjava.awt.*;
importjava.awt.image.*;
importjava.awt.geom.*;
importjava.util.Calendar;
/**
*
* @authorБочкарева Мария
*/
public class CircleClock extends java.applet.Applet implements Runnable {
/**
*
*/
private static final long serialVersionUID = 1L;
private Needle hNeedle, mNeedle, sNeedle;
private ClockDial dial;
private int w, h;
private BufferedImage bi;
private Graphics2D big;
private boolean stop = false;
private Thread timer = null;
private Color dialColor = Color.YELLOW;
private Color hairLineColor = Color.GREEN;
private Color hoursColor = Color.BLACK;
private Color minutesColor = Color.BLUE;
private Color secondsColor = Color.RED;
/** Этот метод будет вызван после загрузки апплета */
publicvoidinit() {
try {
//Создаем объекты и устанавливаем начальные значения.
Dimension dim = getSize();
w = dim.width;
h = dim.height;
//устанавливаем цвета стрелок и циферблата
setColors();
//Создаем стрелки
int radius = 0;
if(w < h)
radius = w/2;
else
radius = h/2;
mNeedle = new Needle(radius, radius/5); //минутная стрелка
hNeedle = new Needle(2d/3d*radius, radius/4); //часовая стрелка
sNeedle = new Needle(radius, radius/10); //секундная стрелка
//создаем циферблат
dial = new ClockDial(radius*2, dialColor, hairLineColor);
//Создаем изображение и получаем его объект Graphics2D.
//Рисовать будем только на нем, а экран выводим уже
//готовый рисунок (т.н. двойная буферезация).
bi = (BufferedImage)createImage(w, h);
big = bi.createGraphics();
big.setRenderingHint(RenderingHints.KEY_ANTIALIASING,
RenderingHints.VALUE_ANTIALIAS_ON);
//Создаем поток, который будет периодически вызывать метод update.
timer = new Thread(this);
timer.start();
}
catch(Exception error) {
System.out.println(error.getMessage());
}
}
/** Этот метод выполняет перерисовку окна апплета */