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. Укажите, например, несуществующий шрифт и посмотрите, какой шрифт будет выбран навигатором для отображения. |




