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