Электронная библиотека книг Александра Фролова и Григория Фролова.
Shop2You.ru Создайте свой интернет-магазин
Библиотека
Братьев
Фроловых

Microsoft Visual J++. Создание приложений и аплетов на языке Java. Часть 1

© Александр Фролов, Григорий Фролов
Том 30, М.: Диалог-МИФИ, 1997, 288 стр.

[Назад] [Содеожание] [Дальше]

Простейший аплет

Аплетами называются приложения Java, которые выполняются под управлением виртуальной машины Java, встроенной в навигатор, такой как Microsoft Internet Explorer или Netscape Navigator. Аплет встраивается в документ HTML и выглядит как окно заранее заданного размера. Он может рисовать в своем окне (и только в нем) произвольные изображения или текст.

Двоичный файл с исполняемым (а точнее говоря, интерпретируемым) кодом Java располагается на сервере WWW. В документе HTML с помощью оператора <APPLET> организуется ссылка на этот двоичный файл.

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

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

Давайте создадим простейший аплет, воспользовавшись для этого системой автоматизированной разработки шаблонов аплета Java Applet Wizard, встроенной в Microsoft Visual J++.

Запустите систему Microsoft Visual J++ и выберите из меню File строку New. В появившейся на экране диалоговой панели New выберите строку New Project Workspace. Затем вам нужно выбрать тип проекта Java Applet Wizard, как это показано на рис. 2.7.

Рис. 2.7. Выбор типа проекта Java Applet Wizard

В поле Name введите имя приложения HelloAp, а в каталоге Location укажите путь к каталогу, в котором будут созданы файлы проекта. Затем нажмите кнопку Create. Вслед за этим на экране появится по очереди несколько диалоговых панелей, в которых вы должны описать создаваемый аплет.

Первая такая диалоговая панель показана на рис. 2.8.

Рис. 2.8. Выбор типа приложения, названия класса и степени подробности создаваемых комментариев к исходному тексту

В поле How would you like to be able to run your program включите переключатель As an applet only. При этом создаваемое приложение сможет работать только под управлением навигатора.

Имя класса аплета нужно указать в поле What would you like to name your applet class. Оставьте имя HelloAp, которое там есть по умолчанию.

Состояние переключателей в поле Would you like to generate source file comments влияет на то, насколько подробно будут комментироваться создаваемый исходный текст приложения, и будет ли он комментироваться вообще.

Если включить переключатель Yes, please, в исходный текст будут добавлены комментарии. Если же включить переключатель No, thank you, никаких комментариев не будет.

При включении переключателя Explanatory comments в исходный текст будут включены комментарии, объясняющие назначение отдельных фрагментов кода. Переключатель TODO влияет на то, будут ли отмечены места исходного текста, в который вы должны вставить свой код, наполняющий аплет реальной жизнью.

Завершив заполнение первой диалоговой панели, нажмите кнопку Next и переходите к следующей панели, показанной на рис. 2.9.

Рис. 2.9. Запрос на создание документа HTML и определение размера окна аплета

Система Java Applet Wizard может создать для вас образец документа HTML, в который будет включен разрабатываемый вами аплет. Для этого во второй диалоговой панели вы должны включить переключатель Yes, please, расположенный в поле Would you like a sample HTML file.

Начальные размеры окна, создаваемого в документе HTML для аплета, определяются в полях Width in pixels и Height in pixels (соответственно, ширина и высота). Заметим, что аплет может изменять размеры своего окна, о чем мы еще будем говорить.

Третья диалоговая панель показана на рис. 2.10.

Рис. 2.10. Вопросы, связанные с мультизадачностью, анимацией и обработкой сообщений от мыши

В этой панели вы должны указать, будет ли ваш аплет создавать задачи. Наш первый аплет однозадачный, поэтому в поле Would you like your applet to be multi-threaded вы должны вклюить переключатель No, thank you.

На вопрос Would you like support for animation вы сможете ответить утвердительно только в том случае, если ваш аплет мультизадачный.

Три переключателя, расположенные в поле Which mouse event handlers would you like added, позволят вам автоматически добавить обработчики сообщений от мыши. Пока не включайте их, так как мышью мы займемся позже.

Следующая, четвертая диалоговая панель показана на рис. 2.11.

Рис. 2.11. Определение параметров, передаваемых аплету

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

В пятой диалоговой панели (рис. 2.12) вам дается возможность отредактировать информацию, описывающую ваш аплет.

Рис. 2.12. Редактирование информации, описывающей аплет

Эта информация будет возвращаться методом getAppInfo, определенным в классе аплета. При необходимости измените строки описания и нажмите кнопку Next.

Финальная диалоговая панель показана на рис. 2.13.

Рис. 2.13. Финальная диалоговая панель

Здесь вы можете последний раз перед созданием файлов проекта посмотреть на заданные вами параметры. Если нажать кнопку OK, проект будет создан. Для отказа от создания проекта нажмите кнопку Cancel.

В результате работы системы Java Applet Wizard будет создано два файла (не считая файла проекта). Это исходный текст аплета HelloAp.java (листинг 2.2) и исходный текст документа HTML HelloAp.html, в который включен создаваемый аплет (листинг 2.3).

Листинг 2.2. Файл HelloAp\HelloAp.java (комментарии переведены на русский язык)


//**********************************************************
// HelloAp.java:	Applet
//
//**********************************************************
import java.applet.*;
import java.awt.*;

//==========================================================
// Основной класс для аплета HelloAp
//
//==========================================================
public class HelloAp extends Applet
{
  // Конструктор класса HelloAp
  //---------------------------------------------------
  public HelloAp()
  {
    // Сделать: Добавьте сюда код конструктора
  }

  // Обеспечение информации об аплете:
  //
  //   Метод getAppletInfo возвращает строку, которая
  // описывает аплет. Вы можете приведсти такую информацию,
  // как имя автора и дата создания, а так же любые другие
  // сведения об аплете
  //------------------------------------------------------
  public String getAppletInfo()
  {
    return "Name: HelloAp\r\n" +
      "Author: Alexandr Frolov\r\n" +
      "Created with Microsoft Visual J++ Version 1.0";
  }

  // Метод init вызывается системой AWT при первой загрузке
  // или перезагрузке аплета. Вы можете переопределить этот
  // метод для выполнения еобходимой инициализации аплета,
  // например, инициализации структур данных, загрузку
  // изображений или шрифтов, создание окон фреймов,
  // установку системы управления внешним видом или
  // добавление элементов пользовательского интерфейса
  //------------------------------------------------------
  public void init()
  {
    // Если для размещения в окне аплета органов управления 
    // вы используете класс "control creator", созданный 
    // системой ResourceWizard, из метода init можно 
    // вызывать метод CreateControls. Удалите вызов функции
    // resize перед добавлением вызова функции 
    // CreateControls, так как эта функция выполняет
    // изменение размера окна аплета самостоятельно
    //--------------------------------------------------
    resize(320, 240);

    // Сделать: Добавьте сюда дополнительный код 
    // инициализации
  }

  // Разместите здесь дополнительный код, необходимый
  // для "чистого" завершения работы аплета. Метод
  // destroy вызывается, когда аплет завершает работу
  // и будет выгружен из памяти
  //---------------------------------------------------
  public void destroy()
  {
    // Сделать: Добавьте сюда код завершения работы аплета
  }

  // Обработчик процедуры рисования окна аплета HelloAp 
  //---------------------------------------------------
  public void paint(Graphics g)
  {
    g.drawString(
      "Created with Microsoft Visual J++ Version 1.0", 
      10, 20);
  }

  //    Метод start вызывается при первом появлении на 
  // экране страницы HTML с аплетом
  //---------------------------------------------------
  public void start()
  {
    // Сделать: Добавьте сюда дополнительный код,
    //   который должен работать при запуске аплета
  }
	
  //    Метод stop вызывается когда страница HTML с 
  // аплетом исчезает с экрана
  //---------------------------------------------------
  public void stop()
  {
    // Сделать: Добавьте сюда дополнительный код,
    //   который должен работать при остановке аплета
  }
  // Сделать: Добавьте сюда дополнительный код
}
Листинг 2.3. Файл HelloAp\HelloAp.html
<html>
<head>
<title>HelloAp</title>
</head>
<body>
<hr>
<applet
    code=HelloAp.class
    id=HelloAp
    width=320
    height=240 >
</applet>
<hr>
<a href="HelloAp.java">The source.</a>
</body>
</html>

Исходные файлы аплета HelloAp

Как мы уже говорили, в результате работы системы Java Applet Wizard созданы файлы HelloAp.java и HelloAp.html. Рассмотрим их по отдельности.

Файл HelloAp.java

Исходный текст аплета HelloAp начинается с двух строк, подключающих оператором import библиотеки классов:


import java.applet.*;
import java.awt.*;

Оператор import должен располагаться в файле исходного текста перед другими операторами (за исключением операторов комментария). В качестве параметра оператору import передается имя подключаемого класса из библиотеки классов. Если же необходимо подключить все классы данной библиотеки (как в нашем случае), вместо имени класса указывается символ “*”.

Мы уже перечисляли библиотеки классов Java. Напомним, что библиотека java.applet содержит классы, необходимые для создания аплетов, то есть разновидности приложений Java, встраиваемых в документы HTML и работающих под управлением навигатора Internet. С помощью классов библиотеки java.awt аплет может выполнять в своем окне рисование различных изображений или текста, причем данный метод рисования не зависит от платформы, на которой работает аплет.

Далее в исходном тексте аплета определяется класс типа public с именем HelloAp, которое должно обязательно совпадать с именем файла, содержащего исходный текст этого класса:


public class HelloAp extends Applet
{
   . . .
}

Определенный нами класс HelloAp с помощью ключевого слова extends наследуется от класса Applet. При этом методам класса HelloAp становятся доступными все методы и данные класса, за исключением определенных как private. Класс Applet определен в библиотеке классов java.applet, которую мы подключили оператором import.

Создавая файл HelloAp.java, система Java Applet Wizard определили в классе HelloAp конструктор и несколько методов, заменив некоторые методы базового класса Applet.

Конструктор HelloAp

Конструктор клсса HelloAp находится в одноименном методе и вызывается при создании объекта класса:


public HelloAp()
{
  // Сделать: Добавьте сюда код конструктора
}

По умолчанию тело конструктора, создаваемого системой Java Applet Wizard, не содержит никакого кода. Однако вы можете добавить сюда строки, выполняющие инициализацию аплета при его создании как объекта.

Метод getAppletInfo

Базовый класс Applet содержит определение метода getAppletInfo, возвращающее значение null. В нашем классе HelloAp, который является дочерним по отношению к классу Applet, система Java Applet Wizard переопределила метод getAppletInfo из базового класса следующим образом:


public String getAppletInfo()
{
  return "Name: HelloAp\r\n" +
    "Author: Alexandr Frolov\r\n" +
    "Created with Microsoft Visual J++ Version 1.0";
}

Теперь этот метод возвращает текстовую информацию об аплете в виде объекта класса String.

Заметьте, что здесь возвращается достаточно длинная строка. Она разделена на три части, но способ разделения отличен от принятого в языке программирования С: части строки объединены оператором “+”. Для объектов класса String этот оператор в языке Java переопределен и имеет очевидное назначение - слияние строк.

Метод init

Метод init, так же как и метод getAppletInfo, определен в базовом классе Applet, от которого наследуются все аплеты. Определение его таково, что этот метод ровным счетом ничего не делает.

Когда вызывается метод init и зачем он нужен?

Метод init вызывается тогда, когда навигатор Internet загружает в свое окно документ HTML с оператором <APPLET>, ссылающимся на данный аплет. В этот момент аплет может выполнять инициализацию, например, создавать задачи, если он работает в мультизадачном режиме.

Существует контрпара для метода init - метод destroy. О нем мы расскажем немного позже.

Система Java Applet Wizard переопределяет метод init следующим образом:


public void init()
{
  resize(320, 240);

  // Сделать: Добавьте сюда дополнительный код 
  // инициализации
}

Здесь вызывается метод resize, который изменяет размер окна аплета. Этот метод определен в базовом классе Applet. В нашем классе вы можете вызывать его потому, что мы образовали этот класс от класса Applet.

Забегая вперед, скажем, что параметры оператора <APPLET>, с помощью которого аплет встраивается в документ HTML, допускают установку размеров окна аплета. Пользуясь методом resize, вы можете изменить эти размеры.

Если же вы желаете изменять размеры окна, редактируя параметры оператора <APPLET> в документе HTML, вы должны удалить вызов метода resize из исходного текста метода init.

Метод destroy

Перед удалением аплета из памяти вызывается метод destroy, который определен в базовом классе Applet как пустая заглушка. Система Java Applet Wizard добавляет в исходный текст класса переопределение метода destroy, которое выглядит следующим образом:


public void destroy()
{
  // Сделать: Добавьте сюда код завершения работы аплета
}

Здесь вы можете выполнить все необходимые операции, которые следует выполнить перед удалением аплета. Например, если в методе init вы создавали какие-либо задачи, в методе destroy вы можете их завершить.

Метод start

Метод start вызывается после метода init в момент, когда пользователь начинает просматривать документ HTML с встроенным в него аплетом. Система Java Applet Wizard создает заглушку, переопределяющую метод start из базового класса:


public void start()
{
  // Сделать: Добавьте сюда дополнительный код,
  //   который должен работать при запуске аплета
}

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

Метод stop

Дополнением к методу start служит метод stop. Он вызывается, когда пользователь покидает страницу с аплетом и загружает в окно навигатора другую страницу. Заметим, что метод stop вызывается перед методом destroy.

По умолчанию система Java Applet Wizard переопределяет метод stop базового класса Applet следующим образом:


public void stop()
{
  // Сделать: Добавьте сюда дополнительный код,
  //   который должен работать при остановке аплета
}
Метод paint

Наиболее интересен для нас метод paint, который выполняет рисование в окне аплета. Вот его исходный текст, созданный системой Java Applet Wizard:


public void paint(Graphics g)
{
  g.drawString(
    "Created with Microsoft Visual J++ Version 1.0", 
    10, 20);
}

Если посмотреть определение класса Applet, то в нем нет метода paint. В каком же классе определен этот метод?

Взглянем на определение класса Applet:


public  class  java.applet.Applet
    extends  java.awt.Panel
{
  . . .
}

Во-первых, вы видите, что полное имя класса Applet есть java.applet.Applet. Включая оператором import библиотеку классов java.applet.*, мы включали и определение класса Applet.

Во-вторых, из определения класса можно заключить, что класс java.applet.Applet произошел от класса java.awt.Panel. Напомним, что определение классов java.awt.* также было включено в исходный текст нашего аплета оператором import.

Если класс java.applet.Applet был создан на базе класса java.awt.Panel, то нет ли в базовом классе определения метода paint?

Изучив исходный текст класса java.awt.Panel, убеждаемся, что такого метода там нет, однако сам класс java.awt.Panel произошел от класса java.awt.Container:


public  class  java.awt.Panel
    extends  java.awt.Container
{
  . . .
}

Продолжим наши исследования. В классе java.awt.Container снова нет метода paint, но сам этот класс создан на базе класса java.awt.Component:


public  abstract  class  java.awt.Container
    extends  java.awt.Component
{
  . . .
}

Но и здесь метода paint нет. Этот метод определен в классе java.awt.Component, который, в свою очередь, произошел от класса java.lang.Object и реализует интерфейс java.awt.image.ImageObserver:


public  abstract  class  java.awt.Component
    extends  java.lang.Object
    implements java.awt.image.ImageObserver
{
  . . .
}

Мы проследили иерархию классов от класса java.applet.Applet, на базе которого создан наш аплет, до класса java.lang.Object, который является базовым для всех классов в Java.

Схематически эту иерархию можно изобразить так:


java.lang.Object (корневой класс)
  -> java.awt.Component
    -> java.awt.Container
      -> java.awt.Panel
        -> java.applet.Applet

Метод paint определен в классе java.awt.Component, но так как этот класс является базовым для класса Applet и для нашего класса HelloAp, мы можем переопределить метод paint.

Теперь о том, когда вызывается метод paint.

Этот метод вызывается, когда необходимо перерисовать окно аплета. Если вы создавали приложения для операционной системы Microsoft Windows, то наверняка знакомы с сообщением WM_PAINT, которое поступает в функцию окна приложения при необходимости его перерисовки.

Перерисовка окна приложения Windows и окна аплета обычно выполняется асинхронно по отношению к работе приложения или аплета. В любой момент времени аплет должен быть готов перерисовать содержимое своего окна.

Такая техника отличается о той, к которой вы, возможно, привыкли, создавая обычные программы для MS-DOS. Программы MS-DOS сами определяют, когда им нужно рисовать на экране, причем рисование может выполняться из разных мест программы. Аплеты, так же как и приложения Windows, выполняют рисование в своих окнах централизованно. Аплет делает это в методе paint, а приложение Windows - при обработке сообщения WM_PAINT.

Обратите внимание, что методу paint в качестве параметра передается ссылка на объект Graphics:


public void paint(Graphics g)
{
  . . .
}

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

Наше приложение вызывает метод drawString, который рисует текстовую строку в окне аплета:


g.drawString(
  "Created with Microsoft Visual J++ Version 1.0", 10, 20);

Вот прототип этого метода:


public abstract void
  drawString(String  str, int  x, int  y);

Через первый параметр методу drawString передается текстовая строка в виде объекта класса String. Второй и третий параметр определяют, соответственно, координаты точки, в которой начнется рисование строки.

В какой координатной системе?

Аплеты используют систему координат, которая соответствует режиму отображения MM_TEXT, знакомому тем, кто создавал приложения Windows. Начало этой системы координат расположено в левом верхнем углу окна аплета, ось X направлена слева направо, а ось Y - сверху вниз (рис. 2.14).

Рис. 2.14. Система координат, используемая методом drawString

На этом же рисунке показано, как метод drawString нарисует текстовую строку с координатами (xCoord, yCoord). Более подробно вопросы рисования в окне аплета мы рассмотрим в третьей главе нашей книги, которая так и называется - “Рисование в окне аплета”.

Файл HelloApp.html

Файл HelloApp.html автоматически создается системой Java Applet Wizard, если это было указано во второй диалоговой панели, задающей параметры нового проекта.

Нас интересует в этом файле оператор <APPLET>, который используется в паре с оператором </APPLET> и предназначен для встраивания окна аплета в документ HTML.

Вот как выглядит фрагмент документа HTML, созданного для нашего проекта, в котором встраивается аплет:


<applet
    code=HelloAp.class
    id=HelloAp
    width=320
    height=240 >
</applet>

Рассмотрим параметры оператора <APPLET>, указанные в этом фрагменте кода, а также некоторые другие.

Параметр

Описание

ALIGN

Выравнивание окна аплета относительно окружающего его текста. Возможны следующие значения:

LEFT выравнивание влево относительно окружающего текста;

CENTER центрирование;

RIGHT выравнивание вправо относительно окружающего текста;

TOP выравнивание по верхней границе;

MIDDLE центрирование по вертикали;

BOTTOM выравнивание по нижней границе

ALT

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

CODE

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

CODEBASE

Базовый адрес URL аплета, то есть путь к каталогу, содержащему аплет

HEIGHT

Начальная ширина окна аплета в пикселах

WIDTH

Начальная высота окна аплета в пикселах

HSPACE

Зазор слева и справа от окна аплета

VSPACE

Зазор сверху и снизу от окна аплета

NAME

Идентификатор аплета, который может быть использован другими аплетами, расположенными в одном и том же документе HTML

TITLE

Строка заголовка

Дополнительно между операторами <APPLET> и </APPLET> вы можете задать параметры аплета. Для этого используется оператор <PARAM>, который мы рассмотрим позже.

Внешний вид окна навигатора, в котором отображается созданный документ HTML с аплетом, показан на рис. 2.15.

Рис. 2.15. Окно аплета в документе HTML

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

В нижней части окна под разделительной линией находится ссылка на исходный текст аплета:


<a href="HelloAp.java">The source.</a>

Вы можете использовать эту ссылку для просмотра содержимого файла HelloAp.java.

Упрощаем исходный текст аплета

Если вам показалось, что исходный текст аплета слишком сложный, вы можете его упростить, как это показано ниже:


//**********************************************************
// HelloAp.java:	Applet
//
//**********************************************************
import java.applet.*;
import java.awt.*;

//==========================================================
// Основной класс для аплета HelloAp
//
//==========================================================
public class HelloAp extends Applet
{
  // Обработчик процедуры рисования окна аплета HelloAp 
  //---------------------------------------------------
  public void paint(Graphics g)
  {
    g.drawString(
      "Created with Microsoft Visual J++ Version 1.0", 
      10, 20);
  }
}

Мы выбросили определения всех методов, которые не выполняют никакой полезной работы, а также удалили методы getAppletInfo и init. Аплет будет работать также, как и раньше, потому что методы init, start, stop, destroy, getAppletInfo, удаленные нами, определены в базовом классе Applet.

Однако метод paint необходимо переопределить в любом случае, так как именно в нем выполняется рисование строки, то есть то, что делает наш аплет.

Почему же система Java Applet Wizard создает пустые определения методов? Просто для того, чтобы вы при необходимости наполнили их чем нибудь полезным. Если вам не нужны эти определения, вы можете их удалить.

[Назад] [Содеожание] [Дальше]