Учим Java. Апплеты. Классы Graphics, Color и Font
Учим Java. Апплеты. Классы Graphics, Color и Font Как мы уже отмечали в предыдущих статьях, апплеты — это один из двух типов приложений в Java. Апплеты отличаются от простых Java-приложений тем, что они могут встраиваться в HTML-код. Апплеты — это client side приложения. Это означает, что выполняются они на машине пользователя, который открыл страницу, содержащую Java-апплет. С одной стороны, это дает свободу действий, ведь апплет может делать все то, что вправе делать сам пользователь. А с другой — мы лишаемся некоторых преимуществ server side приложений.
Основным ограничением апплетов является ограничение на чтение и запись локальных файлов на компьютере пользователя. Но это не распространяется на чтение файлов из Сети. Это ограничение было введено из соображений безопасности. Java-апплеты имеют сравнительно большие возможности, и с их помощью можно было бы без труда копировать данные с машины пользователя на какой-нибудь FTP-сервер или же отсылать по почте.
Создание апплетов несколько отличается от создания обычных Java-приложений. Для создания апплетов в Java существует набор пакетов java.applet.*. Посмотрим, что собой представляет исходный код простейшего апплета:
import java.applet.*;
import java.awt.*;
public class MyFirstApplet extends Applet
{
public void paint(Graphics g)
{
g.drawString("Это мой первый Java-апплет!", 15, 15);
}
}
Импортирование пакетов java.awt.* необходимо в нашем примере, т.к. они содержат класс Graphics. Из этого примера также видно, как наш класс MyFirstApplet наследует свойства и методы класса Applet, базового класса для создания апплетов. В тексте нашего примера мы переопределяем лишь один метод наследуемого класса Applet — это метод Paint, которым мы собственно и выводим строчку в окне апплета в определенной нами позиции окна.
После того, как вы сохраните текст этого апплета в файле MyFirstApplet.java и скомпилируете его, результативный .class файл можно размещать на HTML-странице. Для этого создадим новую страничку с именем applet-test.html и напишем в ней следующий HTML-код:
<html>
<head> <title> MyFirstApplet</title> </head>
<body>
<applet code="MyFirstApplet" width=100 height=50> </applet>
</body>
</html>
Тег <applet> имеет множество параметров, которые определяют, как будет отображаться Java-ап-
плет в окне браузера. В общем виде этот тег будет выглядеть примерно следующим образом:
<APPLET
CODE = appletFile
OBJECT = appletSerialFile
WIDTH = pixels
HEIGHT = pixels
[ARCHIVE = jarFiles]
[CODEBASE = codebaseURL]
[ALT = alternateText]
[NAME = appletInstanceName]
[ALIGN = alignment]
[VSPACE = pixels]
[HSPACE = pixels]
>
[< PARAM NAME = AttributeNamel VALUE = AttributeValuel > ]
[< PARAM NAME = AttributeName2 VALUE = AttributeValue2 > ]
[HTML-текст, отображаемый при отсутствии поддержки Java]
</APPLET>
В общем случае тег <applet> должен иметь хотя бы три обязательных параметра. Это code, width, height. Code задает имя класса апплета, а остальные определяют прямоугольную область, выделяемую под апплет. Остальные параметры используются опционально.
Особое внимание следует уделить тегу <param> . С его помощью мы можем передавать ап-
плету параметры. Это очень схоже со скрытыми (hidden) полями в CGI-программировании. Этими параметрами мы сможем управлять поведением апплета, его свойствами. Например, передадим апплету параметр, определяющий цвет шрифта:
<applet code="MyFirstApplet" width = 100 height = 60>
<param name = "FontColor" value = "blue">
</applet>
Метод getParameter(String) возвращает строку, содержащую значение параметра с именем, переданным этому методу. Этот метод позволит нам узнать, какого цвета нам необходимо выводить строки в своем апплете. Вот как будет выглядеть импортирование значения параметра в переменную типа String:
String FontColor = getParameter ("FontColor");
Теперь можно было бы и несколько изменить код нашего апплета, чтобы цвет выводимого текста соответствовал переданному параметру, но мы еще пока не знаем, каким образом можно изменить цвет шрифта. Поэтому немного отойдем от темы апплетов и рассмотрим основные методы класса Graphics:
drawLine(int x, int y, int x1, int y1)
Этот метод предназначен для рисования отрезка с заданными координатами его концов. Нарисованная линия будет толщиной в 1 пиксель, и никаких средств для изменения стиля прорисовки ее не предусмотрено.
drawArc (int x, int у, int width, int height, int startAngle, int sweepAngle);
fillArc (int x, int у, int width, int height, int startAngle, int sweepAngle);
Эти методы соответственно рисуют дугу и заполняют ее.
drawPolygon (int[] x, int[] y, int count);
fillPolygon (int[] x, int[] y, int count);
Рисуют/заполняют многоугольники. В качестве параметров передаются два массива, содержащие координаты вершин по x и y, и последний параметр задает количество пар координат или же вершин многоугольника.
drawString(String s, int x, int y);
С этим методом мы уже познакомились. Еще раз напомню, что он рисует строку s в позиции с координатами x и y.
Здесь мы перечислили основные методы класса Graphics. Как видно, ничего связанного со шрифтами и цветом не было упомянуто. Специально для шрифтов и цвета в Java существуют два класса Color и Font. Рассмотрим их по отдельности.
У класса Color есть три конструктора. Все три определяют цвет, только в несколько различной форме.
Color(int r, int g, int b);
Этот конструктор создает цвет, смешивая три цвета с заданной интенсивностью. Аббревиатура RGB, наверное, знакома многим. Но тем, кто не знает, объясню: она происходит от заглавных букв английского алфавита имен трех цветов (красный, зеленый, синий). Значения интенсивности задаются в десятеричной системе исчисления.
Color(int c)
Суть та же, разница лишь в том, что число "c" является упакованным значением трех чисел.
Color(float r, float g, float b)
Значения интенсивности определяются диапазоном значений float (от 0 до 1).
Если вы не хотите определять свой цвет, вызывая конструктор Color(), то вы можете воспользоваться уже определенными значениями цветов. Это статические переменные класса Color. Например, Color.black, Color.white, Color.yellow, Color.cyan, Color.magenta, Color.orange, Color.pink и пр.
Класс Font позволяет определить шрифт с указанным именем, стилями и размером.
Font MyFont = new Font("TimesRoman", Font.BOLD, 24);
Помимо BOLD, существуют также статические переменные PLAIN и ITALIC. У класса Font есть методы для определения свойств шрифта:
getName() — возвращает имя шрифта (аналог getFamily())
getSize() — возвращает размер шрифта
getStyle() — возвращает стили шрифта.
Стили шрифта также можно проверить методами isBold(), isPlain() и isItalic().
Познакомившись со всем вышеперечисленным, думаю, можно приступать к реализации поставленной задачи. А именно, написать апплет, у которого цвет надписи соответствовал бы параметру, заданному в HTML-коде. Для этого мы просто в методе main() нашего класса прочитаем значение параметра FontColor, воспользовавшись методом getParameter(), и воспользуемся этим значением для установки цвета выводимой графики. В нашем случае строки.
Содержание метода main() будет выглядеть приблизительно так:
String FontColor = getParameter ("FontColor");
switch (FontColor)
{
case "black": g.setColor (Color.black); break;
case "blue": g.setColor (Color.blue); break;
case "yellow": g.setColor (Color.yellow); break;
// ...
default: g.setColor (Color.black); break;
}
g.drawString("Это мой первый Java-апплет!", 15, 15);
Быть может, это не очень удачная реализация выбора цвета шрифта из HTML, потому как она может охватить только очень ограниченный набор заранее определенных цветов. Но так как вы уже кое-что знаете о классе Color, то для вас не будет проблематичным расширить диапазон цветов за счет передачи цвета в RGB формате, например. Помимо метода setColor класса Graphics, существует также метод setFont. Как несложно догадаться, последний используется для установки параметров используемого шрифта: имени, размера и стилей. Впрочем, все эти параметры должны быть установлены во вновь созданном экземпляре класса Font. Про то, как это делается, мы уже говорили выше. После того, как экземпляр (объект) создан, можно его привязывать к нашему объекту g класса Graphics.
Font myFont = new Font("TimesRoman", Font.BOLD|Font.ITALIC, 12);
g.setFont(myFont);
Не были затронуты некоторые темы (относящиеся к шрифтам, цвету и графике), которые можно было бы рассмотреть именно в этой статье. Но я думаю, что этим мы займемся в следующих статьях. Если вам интересно более подробное обсуждение какой-либо темы, вы хотели бы глубже познакомиться с тем, что я упомянул в нескольких словах, или же у вас просто есть какие-нибудь вопросы, то пишите.
Алексей Литвинюк litvinuke@tut.by
Основным ограничением апплетов является ограничение на чтение и запись локальных файлов на компьютере пользователя. Но это не распространяется на чтение файлов из Сети. Это ограничение было введено из соображений безопасности. Java-апплеты имеют сравнительно большие возможности, и с их помощью можно было бы без труда копировать данные с машины пользователя на какой-нибудь FTP-сервер или же отсылать по почте.
Создание апплетов несколько отличается от создания обычных Java-приложений. Для создания апплетов в Java существует набор пакетов java.applet.*. Посмотрим, что собой представляет исходный код простейшего апплета:
import java.applet.*;
import java.awt.*;
public class MyFirstApplet extends Applet
{
public void paint(Graphics g)
{
g.drawString("Это мой первый Java-апплет!", 15, 15);
}
}
Импортирование пакетов java.awt.* необходимо в нашем примере, т.к. они содержат класс Graphics. Из этого примера также видно, как наш класс MyFirstApplet наследует свойства и методы класса Applet, базового класса для создания апплетов. В тексте нашего примера мы переопределяем лишь один метод наследуемого класса Applet — это метод Paint, которым мы собственно и выводим строчку в окне апплета в определенной нами позиции окна.
После того, как вы сохраните текст этого апплета в файле MyFirstApplet.java и скомпилируете его, результативный .class файл можно размещать на HTML-странице. Для этого создадим новую страничку с именем applet-test.html и напишем в ней следующий HTML-код:
<html>
<head> <title> MyFirstApplet</title> </head>
<body>
<applet code="MyFirstApplet" width=100 height=50> </applet>
</body>
</html>
Тег <applet> имеет множество параметров, которые определяют, как будет отображаться Java-ап-
плет в окне браузера. В общем виде этот тег будет выглядеть примерно следующим образом:
<APPLET
CODE = appletFile
OBJECT = appletSerialFile
WIDTH = pixels
HEIGHT = pixels
[ARCHIVE = jarFiles]
[CODEBASE = codebaseURL]
[ALT = alternateText]
[NAME = appletInstanceName]
[ALIGN = alignment]
[VSPACE = pixels]
[HSPACE = pixels]
>
[< PARAM NAME = AttributeNamel VALUE = AttributeValuel > ]
[< PARAM NAME = AttributeName2 VALUE = AttributeValue2 > ]
[HTML-текст, отображаемый при отсутствии поддержки Java]
</APPLET>
В общем случае тег <applet> должен иметь хотя бы три обязательных параметра. Это code, width, height. Code задает имя класса апплета, а остальные определяют прямоугольную область, выделяемую под апплет. Остальные параметры используются опционально.
Особое внимание следует уделить тегу <param> . С его помощью мы можем передавать ап-
плету параметры. Это очень схоже со скрытыми (hidden) полями в CGI-программировании. Этими параметрами мы сможем управлять поведением апплета, его свойствами. Например, передадим апплету параметр, определяющий цвет шрифта:
<applet code="MyFirstApplet" width = 100 height = 60>
<param name = "FontColor" value = "blue">
</applet>
Метод getParameter(String) возвращает строку, содержащую значение параметра с именем, переданным этому методу. Этот метод позволит нам узнать, какого цвета нам необходимо выводить строки в своем апплете. Вот как будет выглядеть импортирование значения параметра в переменную типа String:
String FontColor = getParameter ("FontColor");
Теперь можно было бы и несколько изменить код нашего апплета, чтобы цвет выводимого текста соответствовал переданному параметру, но мы еще пока не знаем, каким образом можно изменить цвет шрифта. Поэтому немного отойдем от темы апплетов и рассмотрим основные методы класса Graphics:
drawLine(int x, int y, int x1, int y1)
Этот метод предназначен для рисования отрезка с заданными координатами его концов. Нарисованная линия будет толщиной в 1 пиксель, и никаких средств для изменения стиля прорисовки ее не предусмотрено.
drawArc (int x, int у, int width, int height, int startAngle, int sweepAngle);
fillArc (int x, int у, int width, int height, int startAngle, int sweepAngle);
Эти методы соответственно рисуют дугу и заполняют ее.
drawPolygon (int[] x, int[] y, int count);
fillPolygon (int[] x, int[] y, int count);
Рисуют/заполняют многоугольники. В качестве параметров передаются два массива, содержащие координаты вершин по x и y, и последний параметр задает количество пар координат или же вершин многоугольника.
drawString(String s, int x, int y);
С этим методом мы уже познакомились. Еще раз напомню, что он рисует строку s в позиции с координатами x и y.
Здесь мы перечислили основные методы класса Graphics. Как видно, ничего связанного со шрифтами и цветом не было упомянуто. Специально для шрифтов и цвета в Java существуют два класса Color и Font. Рассмотрим их по отдельности.
У класса Color есть три конструктора. Все три определяют цвет, только в несколько различной форме.
Color(int r, int g, int b);
Этот конструктор создает цвет, смешивая три цвета с заданной интенсивностью. Аббревиатура RGB, наверное, знакома многим. Но тем, кто не знает, объясню: она происходит от заглавных букв английского алфавита имен трех цветов (красный, зеленый, синий). Значения интенсивности задаются в десятеричной системе исчисления.
Color(int c)
Суть та же, разница лишь в том, что число "c" является упакованным значением трех чисел.
Color(float r, float g, float b)
Значения интенсивности определяются диапазоном значений float (от 0 до 1).
Если вы не хотите определять свой цвет, вызывая конструктор Color(), то вы можете воспользоваться уже определенными значениями цветов. Это статические переменные класса Color. Например, Color.black, Color.white, Color.yellow, Color.cyan, Color.magenta, Color.orange, Color.pink и пр.
Класс Font позволяет определить шрифт с указанным именем, стилями и размером.
Font MyFont = new Font("TimesRoman", Font.BOLD, 24);
Помимо BOLD, существуют также статические переменные PLAIN и ITALIC. У класса Font есть методы для определения свойств шрифта:
getName() — возвращает имя шрифта (аналог getFamily())
getSize() — возвращает размер шрифта
getStyle() — возвращает стили шрифта.
Стили шрифта также можно проверить методами isBold(), isPlain() и isItalic().
Познакомившись со всем вышеперечисленным, думаю, можно приступать к реализации поставленной задачи. А именно, написать апплет, у которого цвет надписи соответствовал бы параметру, заданному в HTML-коде. Для этого мы просто в методе main() нашего класса прочитаем значение параметра FontColor, воспользовавшись методом getParameter(), и воспользуемся этим значением для установки цвета выводимой графики. В нашем случае строки.
Содержание метода main() будет выглядеть приблизительно так:
String FontColor = getParameter ("FontColor");
switch (FontColor)
{
case "black": g.setColor (Color.black); break;
case "blue": g.setColor (Color.blue); break;
case "yellow": g.setColor (Color.yellow); break;
// ...
default: g.setColor (Color.black); break;
}
g.drawString("Это мой первый Java-апплет!", 15, 15);
Быть может, это не очень удачная реализация выбора цвета шрифта из HTML, потому как она может охватить только очень ограниченный набор заранее определенных цветов. Но так как вы уже кое-что знаете о классе Color, то для вас не будет проблематичным расширить диапазон цветов за счет передачи цвета в RGB формате, например. Помимо метода setColor класса Graphics, существует также метод setFont. Как несложно догадаться, последний используется для установки параметров используемого шрифта: имени, размера и стилей. Впрочем, все эти параметры должны быть установлены во вновь созданном экземпляре класса Font. Про то, как это делается, мы уже говорили выше. После того, как экземпляр (объект) создан, можно его привязывать к нашему объекту g класса Graphics.
Font myFont = new Font("TimesRoman", Font.BOLD|Font.ITALIC, 12);
g.setFont(myFont);
Не были затронуты некоторые темы (относящиеся к шрифтам, цвету и графике), которые можно было бы рассмотреть именно в этой статье. Но я думаю, что этим мы займемся в следующих статьях. Если вам интересно более подробное обсуждение какой-либо темы, вы хотели бы глубже познакомиться с тем, что я упомянул в нескольких словах, или же у вас просто есть какие-нибудь вопросы, то пишите.
Алексей Литвинюк litvinuke@tut.by
Компьютерная газета. Статья была опубликована в номере 11 за 2002 год в рубрике программирование :: java