Microsoft Visual J++. Создание приложений и аплетов на языке 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.


Аплет Painter был создан с помощью системы Java Applet Wizard. Мы выполнили изменения методов init, getAppletInfo и paint.

Изменения метода init заключаются в том, что мы закрыли символом комментария строку установки размеров окна аплета:

public void init()

  {

    // resize(320, 240);

  }

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




Процедура извлечения списка доступных шрифтов, использованная в нашем аплете, достаточно проста и выполняется в методе init, как это показано ниже:

Toolkit toolkit;   // ссылка на Toolkit

String  fntlist[]; // список шрифтов

. . .

public void init()

{

  toolkit = Toolkit.getDefaultToolkit();

  fntlist = toolkit.getFontList();

}

Аплет вызывает статический метод getDefaultToolkit из класса Toolkit и затем, пользуясь полученной ссылкой, извлекает список шрифтов, записывая его в массив fntlist.

Для чего еще можно использовать класс Toolkit?

Класс Toolkit является абстрактным суперклассом для всех реализаций AWT. Порожденные от него классы используются для привязки различных компонент конкретных реализаций.

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

public  abstract  class  java.awt.Toolkit

    extends  java.lang.Object

{

  // -----------------------------------------------------

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

  // -----------------------------------------------------

  public Toolkit();

  // -----------------------------------------------------

  // Методы (сокращенный список)

  // -----------------------------------------------------

  . . .

  // Получение ссылки на Toolkit

  public static Toolkit getDefaultToolkit();   

  // Определение текущей цветовой модели,

  // выбранной в контекст отображения

  public abstract ColorModel getColorModel();  

  // Получение списка шрифтов, доступных аплету

  public abstract String[] getFontList();

  // Получение метрик заданного шрифта

  public abstract FontMetrics getFontMetrics(Font  font);

  // Получение растрового изображения по имени файла

  public abstract Image getImage(String  filename);

  // Получение растрового изображения по адресу URL

  public abstract Image getImage(URL  url);    

  // Определение разрешения экрана в точках на дюйм

  public abstract int getScreenResolution();

  // Размеры экрана в пикселах

  public abstract Dimension getScreenSize();

  // Подготовка растрового изображения для вывода

  public abstract boolean

    prepareImage(Image image, int width, int height,

      ImageObserver observer);

  // Синхронизация состояния Toolkit

  public abstract void sync();

}

Наиболее интересны, с нашей точки зрения, методы getFontList, getScreenResolution и getScreenSize, с помощью которых аплет может, соответственно, плучить список шрифтов, определить разрешение и размер экрана. Последние два параметра позволяют сформировать содержимое окна аплета оптимальным образом исходя из объема информации, который может в нем разместиться.




При инициализации аплета метод init читает все параметры и записывает их значения в соответствующие поля класса, как это показано ниже:

public void init()

{

    String param;

    param = getParameter(PARAM_Str1);

    if (param != null)

      m_Str1 = param;

. . .

    param = getParameter(PARAM_Str5);

    if (param != null)

      m_Str5 = param;

    // Шрифты для отображения строк

    param = getParameter(PARAM_Font1);

    if (param != null)

      m_Font1 = param;

. . .

    param = getParameter(PARAM_Font5);

    if (param != null)

      m_Font5 = param;

    // Начертание шрифтов

    param = getParameter(PARAM_Type1);

    if (param != null)

      m_Type1 = param;

. . .

    param = getParameter(PARAM_Type3);

    if (param != null)

      m_Type3 = param;

}

Здесь все просто. Метод init по очереди получает значения параметров методом getParameter, которому в качестве параметра передается имя параметра аплета. Полученное значение сохраняется в рабочей переменной param и, если оно отлично от значения null, сохраняется в соответствующем поле класса.




Метод init сбрасывает признак рисования, записывая в поле bDrawing значение false, а также создает новый динамический массив в виде объекта класса Vector:

public void init()

{

  bDrawing = false;

  lines = new Vector();

}




Этот метод получает контекст отображения, однако не для рисования, а для определения метрик шрифта:

Graphics g = getGraphics();

FontMetrics fm = g.getFontMetrics();

В переменную yHeight заносится полная высота символов текущего шрифта:

yHeight = fm.getHeight();




При инициализации аплета метод init создает четыре кнопки, сохраняя ссылки на них в соответствующих полях нашего класса, а также добавляет эти кнопки в окно аплета, вызывая для этого метод add:

public void init()

{

  btn1 = new Button("Button 1");

  btn2 = new Button("Button 2");

  btn3 = new Button("Button 3");

  btn4 = new Button("Button 4");

  add(btn1);

  add(btn2);

  add(btn3);

  add(btn4);

  sTextLabel = new String("");

}

После добавления кнопок в строку sTextLabel записывается пустое значение, так как ни одна кнопка еще не была нажата.




До сих пор для изменения цвета фона окна наших аплетов мы раскрашивали окно в желтый цвет явным образом в методе paint. Однако есть и другой способ, основанный на вызове метода setBackground:

setBackground(Color.yellow);

Дополнением к этому методу может послужить метод setForeground, с помощью которого можно установить цвет для рисования в окне.

Почему мы выбрали другой способ изменения фона окна?

Дело в том, что переключатели сами по себе являются окнами, обладающими такими атрибутами, как цвет фона и цвет изображения. Если просто нарисовать их в окне, закрашенным желтым цветом, то получится, что серые переключатели нарисованы на желтом фоне, что некрасиво. Метод setBackground, вызванный для окна аплета, позволяет задать цвет фона не только для контейнера, но и для всех компонент, расположенных в нем.

После установки цвета фона метод init создает три переключателя с независимой фиксацией, указывая их название:

chbox1 = new Checkbox("Switch 1");

chbox2 = new Checkbox("Switch 2");

chbox3 = new Checkbox("Switch 3");

Далее метод init создает группу переключателей с зависимой фиксацией в виде объекта класса CheckboxGroup:

grModeGroup = new CheckboxGroup();

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

rdbox1 = new Checkbox("Mode 1",grModeGroup, true);

rdbox2 = new Checkbox("Mode 2",grModeGroup, false);

rdbox3 = new Checkbox("Mode 3",grModeGroup, false);

rdbox4 = new Checkbox("Mode 4",grModeGroup, false);

Затем метод init создает кнопку с названием Get CheckBoxes state, предназначенную для определения текущего состояния переключателей:

btnGet = new Button("Get CheckBoxes state");

После создания компонент они добавляются в контейнер, которым является окно аплета. Для этого используется метод add.

Прежде всего мы добавляем четыре переключателя с зависимой фиксацией:

add(rdbox1);

add(rdbox2);

add(rdbox3);

add(rdbox4);

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

Далее метод init добавляет в окно аплета переключатели с независимой фиксацией и кнопку:

add(chbox1);

add(chbox2);

add(chbox3);

add(btnGet);




В методе init мы создаем два списка как объекты класса Choice:

chBackgroundColor = new Choice();

chForegroundColor = new Choice();

Созданные списки пока пустые, но мы можем добавить их в окно аплета, вызвав метод add:

add(chBackgroundColor);

add(chForegroundColor);

Сразу после добавления списков мы их заполняем, вызывая для соответствующих объектов метод addItem:

chBackgroundColor.addItem("Yellow");

chBackgroundColor.addItem("Green");

chBackgroundColor.addItem("White");

chForegroundColor.addItem("Black");

chForegroundColor.addItem("Red");

chForegroundColor.addItem("Blue");

Элементы, добавленные в список первыми, будут выбраны в списке по умолчанию. В нашем случае будет выбран фон желтого цвета и изображение черного цвета.

Такие же цвета мы устанавливаем для окна аплета, вызывая методы setBackground и setForeground:

setBackground(Color.yellow);

setForeground(Color.black);




В методе init мы создаем два списка как объекты класса List:

chBackgroundColor = new List(6, false);

chForegroundColor = new List(4, false);

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

Созданные списки добавляются в окно аплета методом add:

add(chBackgroundColor);

add(chForegroundColor);

Сразу после добавления списков мы их заполняем, вызывая для соответствующих объектов метод addItem:

chBackgroundColor.addItem("Yellow");

chBackgroundColor.addItem("Green");

chBackgroundColor.addItem("White");

chBackgroundColor.addItem("Black");

chBackgroundColor.addItem("Red");

chBackgroundColor.addItem("Blue");

chForegroundColor.addItem("Black");

chForegroundColor.addItem("Red");

chForegroundColor.addItem("Blue");

chForegroundColor.addItem("Yellow");

chForegroundColor.addItem("Green");

chForegroundColor.addItem("White");

Затем метод выбирает для фона желтый цвет, а для изображения - черный:

setBackground(Color.yellow);

setForeground(Color.black);




Метод init создает одно текстовое поле, вызывая конструктор с одним параметром - текстовой строкой:

lbTextLabel = new Label("Выберите выравнивание");

Далее этот метод создает три кнопки, с помощью которых вы будете изменять выравнивание текста в поле класса Label:

btnLeft   = new Button("Влево");

btnCenter = new Button("Центровка");

btnRight  = new Button("Вправо");

Затем созданные кнопки и поле добавляются в окно аплета при помощи метода add:

add(btnLeft);

add(btnCenter);

add(btnRight);

add(lbTextLabel);

Последнее, что делает метод init перед возвращением управления, это изменение цвета фона:

setBackground(Color.yellow);




Метод init создает одно текстовое поле редактирования, вызывая конструктор с параметром в виде текстовой строки:

txt = new TextField("Введите строку текста", 35);

Далее этот метод создает кнопку, с помощью которой можно получить текущее содержимое поля редактирования:

btnGetText = new Button("Получить строку");

Затем созданные поле и кнопка добавляются в окно аплета при помощи метода add:

add(txt);

add(btnGetText);

После этого метод init получает текущее содержимое поля редактирования и записывает его в строку str:

str = txt.getText();

В завершении метод init изменяет цвет фона:

setBackground(Color.yellow);




Метод init создает одно текстовое поле редактирования, вызывая конструктор следующего вида:

txt = new TextArea("Введите строку текста", 5, 35);

Здесь создается поле из 5 строк и 35 столбцов.

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

btnGetText = new Button("Получить все");

btnGetSelectedText = new Button("Получить выделенное");

Затем созданные поле и кнопки добавляются в окно аплета при помощи метода add:

add(txt);

add(btnGetText);

add(btnGetSelectedText);

После этого метод init получает текущее содержимое поля редактирования и записывает его в строку str, а затем изменяет цвет фона:

str = txt.getText();

setBackground(Color.yellow);




Метод init создает все необходимые панели и добавляет в них компоненты.

В самом начале своей работы метод init устанавливает желтый цвет фона для окна аплета:

setBackground(Color.yellow);

После этого выбирается такой режим размещения компонентов, при котором они добавляются в таблицу, состоящую из двух строк и одного столбца:

setLayout(new GridLayout(2, 1));

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

Далее метод init создает пять кнопок, которые будут добавлены на страницы блокнота, расположенного в верхней панели:

btn1 = new Button("Button 1");

btn2 = new Button("Button 2");

btn3 = new Button("Button 3");

btn4 = new Button("Button 4");

btn5 = new Button("Button 5");

После создания кнопок метод init приступает к созданию и заполнению панели блокнота. Панель создается при помощи конструктора класса Panel:

pCardPanel = new Panel();

Для этой панели устанавливается режим размещения компонент типа CardLayout, причем между границами окна панели и границами окна добавляемых компонент по вертикали и горизонтали оставлен зазор 5 пикселов:

pCardPanel.setLayout(new CardLayout(5, 5));

После установки режима добавления можно заполнять блокнот кнопками:

pCardPanel.add(btn1);

pCardPanel.add(btn2);

pCardPanel.add(btn3);

pCardPanel.add(btn4);

pCardPanel.add(btn5);

Здесь мы воспользовались известным вам методом add, вызвав его для объекта pCardPanel.

Заполненная панель блокнота при помощи все того же метода add добавляется в окно аплета:

add(pCardPanel);

Так как эта панель добавляется в окно аплета первой, она займет верхнюю половину этого окна.

Завершив с панелью блокнота, метод init приступает к формированию панели управляющих кнопок.

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

btnNext = new Button("Next");

btnPrev = new Button("Prev");

Первая из них перелистывает страницы блокнота в прямом направлении, а вторая - в обратном.

Затем создается панель кнопок:

pButtonPanel = new Panel();

Для панели кнопок мы выбираем режим выравнивания FlowLayout, при котором компоненты добавляются слева направо и сверху вниз:

pButtonPanel.setLayout(new FlowLayout());

После этого в панель добавляются две управляющие кнопки, преднаазначенные для перелистывания страниц блокнота:

pButtonPanel.add(btnNext);

pButtonPanel.add(btnPrev);

На завершающем этапе своей работы метод init добавляет панель управляющих кнопок в окно аплета:

add(pButtonPanel);

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




Метод init выполняет достаточно громоздкую работу по созданию и добавлению различных панелей и других компонентов. К сожалению, приложениям Java не доступны ресурсы, аналогичные ресурсам операционной системы Microsoft Windows, поэтому формирование диалоговых панелей и других элементов пользовательского интерфейса приходится выполнять чисто программными методами на этапе выполнения приложения. Средства среды разработки приложений Java Microsoft Visual J++ версии 1.1, о которых мы уже упоминали, позволяют несколько упростить этот процесс.

Свою работу метод init начинает с установки желтого цвета фона для окна аплета.

Далее устанавливается режим добавления GridLayout, разделяющий окно аплета на три части по горизонтали:

setLayout(new GridLayout(3, 1));

Соответствующая таблица, в которую будут добавляться компоненты, имеет три строки и один столбец.

Панель блокнота создается следующим образом:

pCardPanel = new Panel();

Затем создаются три панели, которые будут добавляться в панель pCardPanel:

pBackgroundColor = new Panel();

pForegroundColor = new Panel();

pFont = new Panel();

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

На следующем этапе создаются три списка, которые будут размещаться по одному на указанных панелях:

chBackgroundColor = new Choice();

chForegroundColor = new Choice();

chFont = new Choice();

Каждый такой список снабжается надписью, поясняющей его назначение. Надписи создаются следующим образом:

tBackgroundColor = new Label("Chose Background Color:");

tForegroundColor = new Label("Chose Foreground Color:");

tFont = new Label("Chose Font:");

Созданные метки и списки добавляются в панели, расположенные на страницах блокнота:

pBackgroundColor.add(tBackgroundColor);

pBackgroundColor.add(chBackgroundColor);

pForegroundColor.add(tForegroundColor);

pForegroundColor.add(chForegroundColor);

pFont.add(tFont);

pFont.add(chFont);



Содержание раздела