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

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

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

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

Приложение TextOut

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

Пользуясь операторами <PARAM>, расположенными в документе HTML сразу после оператора <APPLET>, можно передать аплету произвольное количество параметров, например, в виде текстовых строк:


<applet
    code=TextOut.class
    id=TextOut
    width=320
    height=240 >
    <param name=ParamName1 value="Param Value 1">
    <param name=ParamName2 value="Param Value 2">
    <param name=ParamName3 value="Param Value 3">
    <param name=ParamName4 value="Param Value 4">
     . . .
</applet>

Здесь через параметр NAME оператора <PARAM> передается имя параметра аплета, а через параметр VALUE - значение соответствующего параметра.

Как параметр может получить значение параметров?

Для получения значения любого параметра аплет должен использовать метод getParameter. В качестве единственного параметра этому методу передается имя параметра аплета в виде строки типа String, например:


private String m_ParamName1;
private final String PARAM_ ParamName1= "ParamName1";
String param;

param = getParameter(PARAM_ParamName1);
if (param != null)
  m_ParamName1 = param;

Если вы создаете аплет с помощью системы Java Applet Wizard, то в четвертой диалоговой панели вам предоставляется возможность определить все параметры, передаваемые аплету (рис. 3.12).

Рис. 3.12. Определение параметров аплета (список параметров уже заполнен)

Первоначально список параметров, отображаемых в четвертой диалоговой панели системы Java Applet Wizard, пуст. Такую панель мы показывали раньше на рис. 2.11.

Для добавления нового параметра сделайте щелчок левой клавишей мыши в столбце Name по свободному полю, отмеченному пунктирным прямоугольником. На месте этого прямоугольника появится поле редактирования, в котором вы должны ввести имя параметра. После ввода сделайте щелчок вне поля, после чего в списке параметров появится новая строка.

Создавая проект TextOut, мы выполнили эту операцию для всех параметров, за исключением параметра Font4. Этот параметр мы добавили позже в ручном режиме, когда все файлы проекта уже были созданы.

Обратите внимание, что в столбце Member при заполнении списка автоматически появляются имена полей класса, в которые попадут значения параметров.

После завершения формирования списка параметров мы заполнили столбцы Def-Value и Description (рис. 3.13).

Рис. 3.13. Заполнение столбцов Def-Value и Description

Значения из столбца Def-Value будут использованы для инициализации соответствующих полей класса. Что же касается столбца описаний Description, о эта информация может быть извлечена аплетом и проанализирована. Если в документе HTML находится несколько аплетов (что вполне допустимо), другие аплеты также могут получить описание параметров нашего аплета.

Какие параметры получает наш аплет и что он делает, кроме получения значения параметров?

Через параметры с именами Str1 - Str5 передается пять строк, который аплет отображает в своем окне (рис. 3.14).

Рис. 3.14. Отображение строк в окне аплета TextOut

Параметры Font1 - Font5 задают имена шрифтов для отображения этих строк. С помощью параметра Type1 можно задать стиль шрифта первой и второй строки, с помощью параметра Type2 - третьей и четвертой, а с помощью параметра Type3 - стиль шрифта для пятой строки.

Рассмотрим исходный тексты приложения TextOut.

Исходные тексты приложения TextOut

Файл исходного текста приложения TextOut представлен в листинге 3.5.

Листинг 3.5. Файл TextOut\TextOut.java


// =========================================================
// Установка различных шрифтов.
// Демонстрация способов передачи параметров в аплет
//
// (C) Фролов А.В, 1997
//
// E-mail: frolov@glas.apc.org
// WWW:    http://www.glasnet.ru/~frolov
//            или
//         http://www.dials.ccas.ru/frolov
// =========================================================

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

public class TextOut extends Applet
{
  // -------------------------------------------------------
  // Поля класса.
  // Создаются автоматически для всех параметров аплета
  // -------------------------------------------------------
  private String m_Str1 = "Hello 1";
  private String m_Str2 = "Hello 2";
  private String m_Str3 = "Hello 3";
  private String m_Str4 = "Hello 4";
  private String m_Str5 = "Hello 5";
  private String m_Font1 = "Arial";
  private String m_Font2 = "Courier";
  private String m_Font3 = "Times";
  private String m_Font4 = "Helvetica";
  private String m_Font5 = "Undefined";
  private String m_Type1 = "Bold";
  private String m_Type2 = "Italic";
  private String m_Type3 = "Plain";

  // -------------------------------------------------------
  // Имена параметров
  // -------------------------------------------------------
  private final String PARAM_Str1 = "Str1";
  private final String PARAM_Str2 = "Str2";
  private final String PARAM_Str3 = "Str3";
  private final String PARAM_Str4 = "Str4";
  private final String PARAM_Str5 = "Str5";
  private final String PARAM_Font1 = "Font1";
  private final String PARAM_Font2 = "Font2";
  private final String PARAM_Font3 = "Font3";
  private final String PARAM_Font4 = "Font4";
  private final String PARAM_Font5 = "Font5";
  private final String PARAM_Type1 = "Type1";
  private final String PARAM_Type2 = "Type2";
  private final String PARAM_Type3 = "Type3";

  // -------------------------------------------------------
  // getAppletInfo
  // Метод, возвращающей строку информации об аплете
  // -------------------------------------------------------
  public String getAppletInfo()
  {
    return "Name: TextOut\r\n" +
      "Author: Alexandr Frolov\r\n" +
      "E-mail: frolov@glas.apc.org" +
      "WWW:    http://www.glasnet.ru/~frolov" +
      "Created with Microsoft Visual J++ Version 1.0";
  }

  // -------------------------------------------------------
  // getParameterInfo
  // Метод, возвращающий описание параметров
  // -------------------------------------------------------
  public String[][] getParameterInfo()
  {
    String[][] info =
      {
        { PARAM_Str1, "String", "Text string to write" },
        { PARAM_Str2, "String", "Text string to write" },
        { PARAM_Str3, "String", "Text string to write" },
        { PARAM_Str4, "String", "Text string to write" },
        { PARAM_Str5, "String", "Text string to write" },
        { PARAM_Font1, "String", "Text font" },
        { PARAM_Font2, "String", "Text font" },
        { PARAM_Font3, "String", "Text font" },
        { PARAM_Font4, "String", "Text font" },
        { PARAM_Font5, "String", "Text font" },
        { PARAM_Type1, "String", "Font type" },
        { PARAM_Type2, "String", "Font type" },
        { PARAM_Type3, "String", "Font type" },
      };
    return info;		
  }

  // -------------------------------------------------------
  // init
  // Вызывается во время инициализации аплета
  // -------------------------------------------------------
  public void init()
  {
    // Рабочая переменная для получения параметров
    String param;

    // Получение параметров и сохранение
    // их значений в полях класса

    // Строки, которые будут выведены в окно аплета
    param = getParameter(PARAM_Str1);
    if (param != null)
      m_Str1 = param;

    param = getParameter(PARAM_Str2);
    if (param != null)
      m_Str2 = param;

    param = getParameter(PARAM_Str3);
    if (param != null)
      m_Str3 = param;

    param = getParameter(PARAM_Str4);
    if (param != null)
      m_Str4 = param;

    param = getParameter(PARAM_Str5);
    if (param != null)
      m_Str5 = param;

    // Шрифты для отображения строк
    param = getParameter(PARAM_Font1);
    if (param != null)
      m_Font1 = param;

    param = getParameter(PARAM_Font2);
    if (param != null)
      m_Font2 = param;

    param = getParameter(PARAM_Font3);
    if (param != null)
      m_Font3 = param;

    param = getParameter(PARAM_Font4);
    if (param != null)
      m_Font4 = param;

    param = getParameter(PARAM_Font5);
    if (param != null)
      m_Font5 = param;

    // Начертание шрифтов
    param = getParameter(PARAM_Type1);
    if (param != null)
      m_Type1 = param;

    param = getParameter(PARAM_Type2);
    if (param != null)
      m_Type2 = param;

    param = getParameter(PARAM_Type3);
    if (param != null)
      m_Type3 = param;
  }

  // -------------------------------------------------------
  // paint
  // Метод paint, выполняющий рисование в окне аплета
  // -------------------------------------------------------
  public void paint(Graphics g)
  {
    // Начальная координата для вывода по вертикали
    int yStart   = 20;

    // Текущая координата для вывода строки
    int yCurrent = 20;

    // Определяем текущие размеры окна аплета
    Dimension dimAppWndDimension = size();
    
    // Выбираем в контекст отображения желтый цвет
    g.setColor(Color.yellow);
    
    // Закрашиваем внутреннюю область окна аплета
    g.fillRect(0, 0, 
      dimAppWndDimension.width  - 1, 
      dimAppWndDimension.height - 1);

    // Выбираем в контекст отображения черный цвет
    g.setColor(Color.black);

    // Рисуем рамку вокруг окна аплета
    g.drawRect(0, 0, 
      dimAppWndDimension.width  - 1, 
      dimAppWndDimension.height - 1);

    // Получаем стиль шрифта и выбираем шрифт
    // в соответствии с этим стилем
    if(m_Type1.equals("Bold"))
      g.setFont(new Font(m_Font1, Font.BOLD, 25));

    else if(m_Type1.equals("Italic"))
      g.setFont(new Font(m_Font1, Font.ITALIC, 25));

    else if(m_Type1.equals("Plain"))
      g.setFont(new Font(m_Font1, Font.PLAIN, 25));

    // Отступ для первой строки
    yCurrent += yStart;

    // Рисуем первую строку
    g.drawString(m_Str1, 10, yCurrent);

    // Определяем метрики шрифта
    FontMetrics fm = g.getFontMetrics();

    // Устанавливаем новую текущую позицию для
    // вывода очередной строки
    yCurrent += fm.getHeight();

    // Выбираем шрифт в контекст отображения
    if(m_Type1.equals("Bold"))
      g.setFont(new Font(m_Font2, Font.BOLD, 25));

    else if(m_Type1.equals("Italic"))
      g.setFont(new Font(m_Font2, Font.ITALIC, 25));

    else if(m_Type1.equals("Plain"))
      g.setFont(new Font(m_Font2, Font.PLAIN, 25));

    // Рисуем вторую строку
    g.drawString(m_Str2, 10, yCurrent);

    // Устанавливаем новую текущую позицию для
    // вывода очередной строки
    fm = g.getFontMetrics();
    yCurrent += fm.getHeight();

    // Выбираем шрифт в контекст отображения
    if(m_Type2.equals("Bold"))
      g.setFont(new Font(m_Font3, Font.BOLD, 25));

    else if(m_Type2.equals("Italic"))
      g.setFont(new Font(m_Font3, Font.ITALIC, 25));

    else if(m_Type2.equals("Plain"))
      g.setFont(new Font(m_Font3, Font.PLAIN, 25));

    // Рисуем третью строку
    g.drawString(m_Str3, 10, yCurrent);

    // Устанавливаем новую текущую позицию для
    // вывода очередной строки
    fm = g.getFontMetrics();
    yCurrent += fm.getHeight();

    // Выбираем шрифт в контекст отображения
    if(m_Type2.equals("Bold"))
      g.setFont(new Font(m_Font4, Font.BOLD, 25));

    else if(m_Type2.equals("Italic"))
      g.setFont(new Font(m_Font4, Font.ITALIC, 25));

    else if(m_Type2.equals("Plain"))
      g.setFont(new Font(m_Font4, Font.PLAIN, 25));

    // Рисуем четвертую строку
    g.drawString(m_Str4, 10, yCurrent);

    // Устанавливаем новую текущую позицию для
    // вывода очередной строки
    fm = g.getFontMetrics();
    yCurrent += fm.getHeight();

    // Выбираем шрифт в контекст отображения
    if(m_Type3.equals("Bold"))
      g.setFont(new Font(m_Font5, Font.BOLD, 25));

    else if(m_Type3.equals("Italic"))
      g.setFont(new Font(m_Font5, Font.ITALIC, 25));

    else if(m_Type3.equals("Plain"))
      g.setFont(new Font(m_Font5, Font.PLAIN, 25));

    // Рисуем пятую строку
    g.drawString(m_Str5, 10, yCurrent);
  }
}

Исходный текст документа HTML, в который встроен аплет TextOut, приведен в листинге 3.6.

Листинг 3.6. Файл TextOut\TextOut.html


<html>
<head>
<title>TextOut</title>
</head>
<body>
<hr>
<applet
    code=TextOut.class
    id=TextOut
    width=320
    height=240 >
    <param name=Str1 value="Hello 1">
    <param name=Str2 value="Hello 2">
    <param name=Str3 value="Hello 3">
    <param name=Str4 value="Hello 4">
    <param name=Str5 value="Hello 5">
    <param name=Font1 value="Dialog">
    <param name=Font2 value="Courier">
    <param name=Font3 value="TimesRoman">
    <param name=Font4 value="Helvetica">
    <param name=Font5 value="Undefined">
    <param name=Type1 value="Bold">
    <param name=Type2 value="Italic">
    <param name=Type3 value="Plain">
</applet>
<hr>
<a href="TextOut.java">The source.</a>
</body>
</html>

Описание исходных текстов

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

Какие строки добавляются системой Java Applet Wizard для обработки параметров?

Поля класса TextOut

Прежде всего, создаются поля класса для хранения значений параметров:


private String m_Str1 = "Hello 1";
. . .
private String m_Str5 = "Hello 5";
private String m_Font1 = "Arial";
. . .
private String m_Font5 = "Undefined";
private String m_Type1 = "Bold";
private String m_Type2 = "Italic";
private String m_Type3 = "Plain";

Поля инициализируются значениями по умолчанию, которые вы ввели при заполнении таблицы, показанной на рис. 3.13.

Далее в классе определяются поля с названиями параметров:


private final String PARAM_Str1 = "Str1";
. . .
private final String PARAM_Str5 = "Str5";
private final String PARAM_Font1 = "Font1";
. . .
private final String PARAM_Font5 = "Font5";
private final String PARAM_Type1 = "Type1";
private final String PARAM_Type2 = "Type2";
private final String PARAM_Type3 = "Type3";

Названия параметров будут нужны для извлечения значений параметров методом getParameter класса Applet.

Метод getParameterInfo

Система Java Applet Wizard переопределяет метод getParameterInfo, который возвращает ссылку на массив массивов с описаниями параметров:


public String[][] getParameterInfo()
{
  String[][] info =
  {
    { PARAM_Str1, "String", "Text string to write" },
     . . .
    { PARAM_Str5, "String", "Text string to write" },
    { PARAM_Font1, "String", "Text font" },
     . . .
    { PARAM_Font5, "String", "Text font" },
    { PARAM_Type1, "String", "Font type" },
    { PARAM_Type2, "String", "Font type" },
    { PARAM_Type3, "String", "Font type" },
  };
  return info;		
}

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

Метод init

При инициализации аплета метод 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, сохраняется в соответствующем поле класса.

Метод paint

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


if(m_Type1.equals("Bold"))
  g.setFont(new Font(m_Font1, Font.BOLD, 25));

else if(m_Type1.equals("Italic"))
  g.setFont(new Font(m_Font1, Font.ITALIC, 25));

else if(m_Type1.equals("Plain"))
  g.setFont(new Font(m_Font1, Font.PLAIN, 25));

Для сравнения строк класса String мы используем метод equals, который возвращает значение true при совпадении с заданной строкой и false в противном случае.

Методу выбора шрифта setFont мы передаем объект класса Font, созданный конструктором.

Конструктор получает в качетсве первого параметра содержимое поля класса m_Font1, которое соответствует значению параметра аплета с именем Font1.

Значение второго параметра (стиль шрифта) выбирается исходя из значения параметра аплета с именем m_Type1. Здесь мы указываем константы, определенные в классе Font.

И, наконец, третий параметр конструктора класса Font задает размер символов шрифта, равный 25 пикселам.

После выбора шрифта мы выполняем отступ от верхней границы окна и рисуем первую строку в позиции (0, yCurrent):


yCurrent += yStart;
g.drawString(m_Str1, 10, yCurrent);

На следующем этапе метод paint получает метрику только что выбранного шритфа и увеличивает текущую позицию yCurrent на величину полной высоты символов шрифта, полученную с помощью метода getHeight:


FontMetrics fm = g.getFontMetrics();
yCurrent += fm.getHeight();

Далее эта же процедура повторяется для остальный четырех отображаемых в окне аплета строк.

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

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