Реферат: Конспект лекций по курсу Выбранные вопросы информатики (часть 2) для специальности Информатика Графика
Министерство образования и науки Украины
Луганский национальный педагогический университет
Кафедра информационных технологий и систем
Конспект лекций по курсу
Выбранные вопросы информатики
(часть 2)
для специальности
Информатика
Графика/
AWT /
Многопоточность и легковесные процессы (доп.мат)/
Ввод – вывод и работа с файлами (доп.мат)/
Работа в сети (доп.мат)/
Растровые изображения и анимация и звук
Луганск 2005г
Лекция 1
Графика
Контекст отображения
Проще всего представить себе контекст отображения как полотно, на котором рисует художник. Точно так же как художник может выбирать для рисования различные инструменты, программист, создающий аплет Java, может выбирать различные методы класса Graphics и задавать различные атрибуты контекста отображения.
^ Методы класса Graphics
В качестве базового для класса Graphics (полное название класса java.awt.Graphics) выступает класс java.lang.Object.
Прежде всего мы приведем прототипы конструктора этого класса и его методов с краткими комментариями. Полное описание вы сможете найти в электронной документации, которая входит в комплект Java WorkShop.
Далее мы рассмотрим назначение основных методов, сгруппировав их по выполняемым функциям.
Конструктор
Graphics
protected Graphics();
Методы
clearRect
Стирание содержимого прямоугольной области
public abstract void clearRect(int x, int y, int width, int height);
clipRect
Задание области ограничения вывода
public abstract void clipRect(int x, int y, int width, int height);
copyArea
Копирование содержимого прямоугольной области
public abstract void copyArea(int x, int y, int width, int height, int dx, int dy);
create
Создание контекста отображения
public abstract Graphics create();
public Graphics create(int x, int y, int width, int height);
dispose
Удаление контекста отображения
public abstract void dispose();
draw3DRect
Рисование прямоугольной области с трехмерным выделением
public void draw3DRect(int x, int y, int width, int height, boolean raised);
drawArc
Рисование сегмента
public abstract void drawArc(int x, int y, int width, int height, int startAngle, int arcAngle);
Рисование сегмента
drawBytes
Рисование текста из массива байт
public void drawBytes(byte data[], int offset, int length, int x, int y);
drawChars
Рисование текста из массива символов
public void drawChars(char data[], int offset, int length, int x, int y);
drawImage
Рисование растрового изображения
public abstract boolean drawImage(Image img, int x, int y, Color bgcolor, ImageObserver observer);
public abstract boolean drawImage(Image img, int x, int y, ImageObserver observer);
public abstract boolean drawImage(Image img,int x, int y, int width, int height, Color bgcolor, ImageObserver observer);
public abstract boolean drawImage(Image img, int x, int y, int width, int height, ImageObserver observer);
drawLine
Рисование линии
public abstract void drawLine(int x1, int y1, int x2, int y2);
drawOval
Рисование овала
public abstract void drawOval(int x, int y, int width, int height);
drawPolygon
Рисование многоугольника
public abstract void drawPolygon(int xPoints[], int yPoints[], int nPoints);
public void drawPolygon(Polygon p);
drawRect
Рисование прямоугольника
public void drawRect(int x, int y, int width, int height);
drawRoundRect
Рисование прямоугольника с круглыми углами
public abstract void drawRoundRect(int x, int y, int width, int height, int arcWidth, int arcHeight);
drawString
Рисование текстовой строки
public abstract void drawString(String str, int x, int y);
fill3DRect
Рисование заполненного прямоугольника с трехмерным выделением
public void fill3DRect(int x, int y, int width, int height, boolean raised);
fillArc
Рисование заполненного сегмента круга
public abstract void fillArc(int x, int y, int width, int height, int startAngle, int arcAngle);
fillOval
Рисование заполненного овала
public abstract void fillOval(int x, int y, int width, int height);
fillPolygon
Рисование заполненного многоугольника
public abstract void fillPolygon(int xPoints[], int yPoints[], int nPoints);
fillPolygon
Рисование заполненного многоугольника
public void fillPolygon(Polygon p);
public abstract void fillRect(int x, int y, int width, int height);
fillRoundRect
Рисование заполненного прямоугольника с круглыми углами
public abstract void fillRoundRect(int x, int y, int width, int height,int arcWidth, int arcHeight);
finalize
Прослеживание вызова метода dispose
public void finalize();
getClipRect
Определение границ области ограничения вывода
public abstract Rectangle getClipRect();
getColor
Определение цвета, выбранного в контекст отображения
public abstract Color getColor();
getFont
Определение шрифта, выбранного в контекст отображения
public abstract Font getFont();
getFontMetrics
Определение метрик текущего шрифта
public FontMetrics getFontMetrics();
getFontMetrics
Определение метрик заданного шрифта
public abstract FontMetrics
getFontMetrics(Font f);
setColor
Установка цвета для рисования в контексте отображения
public abstract void setColor(Color c);
setFont
Установка текущего шрифта в контексте отображения
public abstract void setFont(Font font);
setPaintMode
Установка режима рисования
Метод setPaintMode устанавливает в контексте отображения режим рисования, при котором выполняется замещение изображения текущим цветом, установленном в контексте отображения.
public abstract void setPaintMode();
setXORMode
Установка маски для рисования
Задавая маску для рисования при помощи метода setXORMode, вы можете выполнить при рисовании замещение текущего цвета на цвет, указанный в параметре метода, и наоборот, цвета, указанного в параметре метода, на текущий.
Все остальные цвета изменяются непредсказуемым образом, однако эта операция обратима, если вы нарисуете ту же самую фигуру два раза на одном и том же месте.
public abstract void setXORMode(Color c1);
translate
Сдвиг начала системы координат
Метод translate сдвигает начало системы координат в контексте отображения таким образом, что оно перемещается в точку с координатами (x, y), заданными через параметры метода:
public abstract void translate(int x, int y);
toString
Получение текстовой строки, представляющей данный контекст отображения
public String toString();
^ Установка атрибутов контекста отображения
Изменяя атрибуты контекста отображения, приложение Java может установить цвет для рисования графических изображений, таких как линии и многоугольники, шрифт для рисования текста, режим рисования и маску. Возможен также сдвиг начала системы координат.
^ Выбор цвета
Изменение цвета, выбранного в контекст отображения, выполняется достаточно часто. В классе Graphics для изменения цвета определен метод setColor, прототип которого представлен ниже:
public abstract void setColor(Color c);
В качестве параметра методу setColor передается ссылка на объект класса Color, с помощью которого можно выбрать тот или иной цвет.
Как задается цвет?
Для этого можно использовать несколько способов.
Прежде всего, вам доступны статические объекты, определяющие фиксированный набор основных цветов:
Объект
Цвет
public final static Color black;
черный
public final static Color blue;
голубой
public final static Color cyan;
циан
public final static Color darkGray;
темно-серый
public final static Color gray;
серый
public final static Color green;
зеленый
public final static Color lightGray;
светло-серый
public final static Color magenta;
малиновый
public final static Color orange;
оранжевый
public final static Color pink;
розовый
public final static Color red;
красный
public final static Color white;
белый
public final static Color yellow;
желтый
Этим набором цветов пользоваться очень просто:
public void paint(Graphics g)
{
g.setColor(Color.yellow);
g.drawString("Hello, Java world!", 10, 20);
. . .
}
Здесь мы привели фрагмент исходного текста метода paint, в котором в контексте отображения устанавливается желтый цвет. После этого метод drawString выведет текстовую строку " Hello, Java world!" желтым цветом.
Если необходима более точная установка цвета, вы можете воспользоваться одним из трех конструкторов объекта Color:
public Color(float r, float g, float b);
public Color(int r, int g, int b);
public Color(int rgb);
Первые два конструктора позволяют задавать цвет в виде совокупности значений трех основных цветовых компонент - красной, желтой и голубой (соответственно, параметры r, g и b). Для первого конструктора диапазон возможных значений компонент цвета находится в диапазоне от 0.0 до 1.0, а для второго - в диапазоне от 0 до 255.
Третий конструктор также позволяет задавать отдельные компоненты цвета, однако они должны быть скомбинированы в одной переменной типа int. Голубая компонента занимает биты от 0 до 7, зеленая - от 8 до 15, красная - от 16 до 23.
Ниже мы привели пример выбора цвета с помощью конструктора, передав ему три целочисленных значения цветовых компонент:
g.setColor(new Color(0, 128, 128));
В классе Color определено еще несколько методов, которые могут оказаться вам полезными:
Метод Описание
public Color brighter ();
Установка более светлого варианта того же цвета
public Color darker ();
Установка более темного варианта того же цвета
public boolean equals (Object obj);
Проверка равенства цветов текущего объекта и объекта, заданного параметром
public int getBlue ();
Определение голубой компоненты цвета (в диапазоне от 0 до 255)
public int getRed ();
Определение красной компоненты цвета (в диапазоне от 0 до 255)
public int getGreen ();
Определение зеленой компоненты цвета (в диапазоне от 0 до 255)
getHSBColor (float h, float s, float b);
Определение компонент оттенка, насыщенности и яркости (схема HSB)
public int getRGB ();
Определение компонент RGB для цвета, выбранного в контекст отображения
public static int HSBtoRGB (float hue, float saturation, float brightness);
Преобразование цветового представления из схемы HSB в схему RGB
public static float[] RGBtoHSB (int r, int g, int b, float hsbvals[]);
Преобразование, обратное выполняемому предыдущей функцией
public String toString ();
Получение текстовой строки названия цвета
Второй способ установки цвето фона и изображения заключается в вызове методов setBackground и setForeground, например:
setBackground(Color.yellow);
setForeground(Color.black);
Здесь мы устанавливаем для окна аплета желтый цвет фона и черный цвет изображения.
^ Выбор шрифта
С помощью метода setFont из класса Graphics вы можете выбрать в контекст отображения шрифт, который будет использоваться методами drawString, drawBytes и drawChars для рисования текста. Вот прототип метода setFont:
public abstract void setFont(Font font);
В качестве параметра методу setFont следует передать объект класса Font.
Класс Font
Приведем краткое перечисление полей, конструкторов и методов этого класса.
Поля класса
name
protected String name;
size
protected int size;
style
protected int style;
Битовые маски стиля шрифта
BOLD
public final static int BOLD;
ITALIC
public final static int ITALIC;
PLAIN
public final static int PLAIN;
Конструкторы
public Font(String name,
int style, int size);
Методы
equals
Сравнение шрифтов
public boolean equals(Object obj);
getFamily
Определение названия семейства шрифтов
public String getFamily();
getFont
Получение шрифта по его характеристикам
public static Font getFont(String nm);
public static Font getFont(String nm,
Font font);
getName
Определение названия шрифта
public String getName();
getSize
Определение размера шрифта
public int getSize();
getStyle
Определение стиля шрифта
public int getStyle();
hashCode
Получение хэш-кода шрифта
public int hashCode();
isBold
Определение жирности шрифта
public boolean isBold();
isItalic
Проверка, является ли шрифт наклонным
public boolean isItalic();
isPlain
Проверка, есть ли шрифтовое выделение
public boolean isPlain();
toString
Получение текстовой строки для объекта
public String toString();
Создавая шрифт конструктором Font, вы должны указать имя, стиль и размер шрифта.
В качестве имени можно указать, например, такие строки как Helvetica или Courier. Учтите, что в системе удаленного пользователя, загрузившего ваш аплет, может не найтись шрифта с указанным вами именем. В этом случае браузер заменит его на наиболее подходящий (с его точки зрения).
Стиль шрифта задается масками BOLD, ITALIC и PLAIN, которые можно комбинировать при помощи логической операции "ИЛИ":
Маска Описание
BOLD
Утолщенный шрифт
ITALIC
Наклонный шрифт
PLAIN
Шрифтовое выделение не используется
Что же касается размера шрифта, то он указывается в пикселах.
^ Определение атрибутов контекста отображения
Ряд методов класса Graphics позволяет определить различные атрибуты контекста отображения, например, цвет, выбранный в контекст отображения или метрики текущего шрифта, которым выполняется рисование текста.
Рассмотрим методы, позволяющие определить атрибуты контекста отображения.
^ Определение границ области ограничения вывода
С помощью метода clipRect, о котором мы расскажем чуть позже, вы можете определить в окне аплета область ограничения вывода прямоугольной формы. Вне этой области рисование графических изображений и текста не выполняется.
Метод getClipRect позволяет вам определить координаты текущей области ограничения, заданной в контексте отображения:
public abstract Rectangle getClipRect();
Метод возвращает ссылку на объект класса Rectangle, который, в частности, имеет поля класса с именами x, y, height и width. В этих полях находится, соответственно, координаты верхнего левого угла, высота и ширина прямоугольной области.
^ Определение цвета, выбранного в контекст отображения
Метод getColor возвращает ссылку на объект класса Color, представляющий текущий цвет, выбранный в контекст отображения:
public abstract Color getColor();
^ Определение шрифта, выбранного в контекст отображения
С помощью метода getFont, возвращающего ссылку на объект класса Font, вы можете определить текущий шрифт, выбранный в контекст отображения:
public abstract Font getFont();
^ Определение метрик текущего шрифта
Несмотря на то что вы можете заказать шрифт с заданным именем и размером, не следует надеяться, что навигатор выделит вам именно такой шрифт, какой вы попросите. Для правильного размещения текста и других изображений в окне аплета вам необходимо знать метрики реального шрифта, выбранного навигатором в контекст отображения.
Метрики текущего шрифта в контексте отображения вы можете узнать при помощи метода getFontMetrics, прототип которого приведен ниже:
public FontMetrics getFontMetrics();
Метод getFontMetrics возвращает ссылку на объект класса FontMetrics. Ниже мы привели список наиболее важных методов этого класса, предназначенных для получения отдельных параметров шрифта:
Метод Описание
public Font getFont();
Определение шрифта, который описывается данной метрикой
public int bytesWidth(byte data[], int off, int len);
Метод возвращает ширину строки символов, расположенных в массиве байт data. Параметры off и len задают, соответственно, смещение начала строки в массиве и ее длину
public int charsWidth(char data[], int off, int len);
Метод возвращает ширину строки символов, расположенных в массиве символов data. Параметры off и len задают, соответственно, смещение начала строки в массиве и ее длину
public int charWidth(char ch);
Метод возвращает ширину заданного символа
public int charWidth(int ch);
Метод возвращает ширину заданной строки символов
public int getAscent();
Определение расстояния от базовой линии до верхней выступающей части символов
public int getDescent();
Определение расстояния от базовой линии до нижней выступающей части символов
public int getLeading();
Расстояние между строками текста
public int getHeight();
Определение полной высоты символов, выполняется по формуле:
getLeading() + getAscent() + getDescent()
public int getMaxAdvance();
Максимальная ширина символов в шрифте
public int getMaxAscent();
Максимальное расстояние от базовой линии до верхней выступающей части символов для символов данного шрифта
public int getMaxDescent();
Максимальное расстояние от базовой линии до нижней выступающей части символов для символов данного шрифта
public int[] getWidths();
Массив, в котором хранятся значения ширины первых 256 символов в шрифте
public int stringWidth(String str);
Ширина строки, передаваемой методу в качестве параметра
public String toString();
Текстовая строка, представляющая данную метрику шрифта
Обратите внимание на метод stringWidth, позволяющий определить ширину текстовой строки. Заметим, что без этого метода определение ширины текстовой строки было бы непростой задачей, особенно если шрифт имеет переменную ширину символов.
Для определения полной высоты строки символов вы можете воспользоваться методом getHeight.
^ Определение метрик заданного шрифта
Метод getFontMetrics с параметром типа Font позволяет определить метрики любого шрифта, передаваемого ему в качестве параметра:
public abstract FontMetrics
getFontMetrics(Font f);
В отличие от нее метод getFontMetrics без параметров возвращает метрики текущего шрифта, выбранного в контекст отображения.
^ Рисование геометрических фигур
В этом разделе мы опишем методы класса Graphics, предназначенные для рисования элементарных геометрических фигур, таких как линии, прямоугольники, окружности и так далее.
Линии
Для того чтобы нарисовать прямую тонкую сплошную линию, вы можете воспользоваться методом drawLine, прототип которого приведен ниже:
public abstract void drawLine(int x1,
int y1,int x2, int y2);
Концы линии имеют координаты (x1, y1) и (x2, y2), как это показано на рис. 1.
Рис. 1. Рисование прямой линии
К сожалению, в контексте отображения не предусмотрены никакие атрибуты, позволяющие нарисовать пунктирную линию или линию увеличенной толщины.
^ Прямоугольники и квадраты
Среди методов класса Graphics есть несколько, предназначенных для рисования прямоугольников. Первый из них, с именем drawRect, позволяет нарисовать прямоугольник, заданный координатами своего левого верхнего угла, шириной и высотой:
public void drawRect(int x, int y, int width, int height);
Параметры x и y задают, соответственно, координаты верхнего левого угла, а параметры width и height - высоту и ширину прямоугольника (рис. 2).
Рис. 2. Рисование прямоугольника
В отличие от метода drawRect, рисующего только прямоугольную рамку, метод fillRect рисует заполненный прямоугольник. Для рисования и заполнения прямоугольника используется цвет, выбранный в контекст отображения (рис. 3).
Рис. 3. Рисование заполненного прямоугольника
Прототип метода fillRect приведен ниже:
public abstract void fillRect(int x, int y, int width, int height);
Метод drawRoundRect позволяет нарисовать прямоугольник с закругленными углами:
public abstract void drawRoundRect(int x, int y, int width, int height, int arcWidth, int arcHeight);
Параметры x и y определяют координаты верхнего левого угла прямоугольника, параметры width и height задают, соответственно его ширину и высоту.
Размеры эллипса, образующего закругления по углам, вы можете задать с помощью параметров arcWidth и arcHeight. Первый из них задает ширину эллипса, а второй - высоту (рис. 4).
Рис. 4. Рисование прямоугольника с закругленными углами
Метод fillRoundRect позволяет нарисовать заполненный прямоугольник с закругленными углами (рис. 5).
Рис. 5. Рисование заполненного прямоугольника с закругленными углами
Назначение параметров этого метода аналогично назначению параметров только что рассмотренного метода drawRoundRect:
public abstract void fillRoundRect(int x, int y, int width, int height, int arcWidth, int arcHeight);
Метод fill3Drect предназначен для рисования выступающего или западающего прямоугольника:
public void fill3DRect(int x, int y, int width, int height, boolean raised);
Если значение параметра raised равно true, рисуется выступающий прямоугольник, если false - западающий. Назначение остальных параметров аналогично назначению параметров метода drawRect.
Многоугольники
Для рисования многоугольников в классе Graphics предусмотрено четыре метода, два из которых рисуют незаполненные многоугольники, а два - заполненные.
Первый метод рисует незаполненный многоугольник, заданный массивами координат по осям X и Y:
public abstract void drawPolygon(int xPoints[], int yPoints[], int nPoints);
Через параметры xPoints и yPoints передаются, соответственно, ссылки на массивы координат по оис X и Y. Параметр nPoints задает количество точек в массивах.
На рис. 6 показан многоугольник, нарисованный методом drawPolygon.
Рис. 6. Многоугольник, нарисованный методом drawPolygon
В этом многоугольнике шесть вершин с координатами от (x0, y0) до (x5, y5), причем для того чтобы он стал замкнутым, координаты первой и последней вершины совпадают.
Второй метод также рисует незаполненный многоугольник, однако в качестве параметра методу передается ссылка на объект Polygon:
public void drawPolygon(Polygon p);
Класс Polygon достаточно прост. Приведем описание его полей, конструкторов и методов:
Поля класса
npoints
Количество вершин
public int npoints;
xpoints
Массив координат по оси X
public int xpoints[];
ypoints
Массив координат по оси Y
public int ypoints[]
Конструкторы
public Polygon ();
public Polygon(int xpoints[], int ypoints[], int npoints);
Методы
addPoint
Добавление вершины
public void addPoint(int x, int y);
getBoundingBox
Получение координат охватывающего прямоугольника
public Rectangle getBoundingBox();
inside
Проверка, находится ли точка внутри многоугольника
public boolean inside(int x, int y);
Ниже мы показали фрагмент кода, в котором создается многоугольник, а затем в него добавляется несколько точек. Многоугольник рисуется методом drawPolygon:
Polygon p = new Polygon();
p.addPoint(270, 239);
p.addPoint(350, 230);
p.addPoint(360, 180);
p.addPoint(390, 160);
p.addPoint(340, 130);
p.addPoint(270, 239);
g.drawPolygon(p);
Если вам нужно нарисовать заполненный многоугольник (рис. 7), то для этого вы можете воспользоваться методами, приведенными ниже:
public abstract void fillPolygon(int xPoints[],int yPoints[], int nPoints);
public void fillPolygon(Polygon p);
Первый из этих методов рисует многоугольник, координаты вершин которого заданы в массивах, второй - получая объект класса Polygon в качестве параметра.
Рис. 7. Многоугольник, нарисованный методом fillPolygon
^ Овалы и круги
Для рисования окружностей и овалов вы можете воспользоваться методом drawOval:
public abstract void drawOval(int x, int y, int width, int height);
Параметры этого методы задают координаты и размеры прямоугольника, в который вписывается рисуемый овал (рис. 8).
Рис. 8. Рисование овала
Метод fillOval предназначен для рисования заполненного овала (рис. 9). Назначение его параметров аналогично назначению параметров метода drawOval:
public abstract void fillOval(int x, int y, int width, int height);
Рис. 9. Рисование заполненного овала
Сегменты
Метод drawArc предназначен для рисования незаполненного сегмента (рис. 10). Прототип этого метода приведен ниже:
public abstract void drawArc(int x, int y, int width, int height, int startAngle, int arcAngle);
Рис. 10. Рисование незаполненного сегмента
Параметры x, y, width и height задают координаты прямоугольника, в который вписан сегмент.
Параметры startAngle и arcAngle задаются в градусах. Они определяют, соответственно, начальный угол и угол разворота сегмента.
Для того чтобы нарисовать заполненный сегмент, вы можете воспользоваться методом fillArc:
public abstract void fillArc(int x, int y, int width, int height, int startAngle, int arcAngle);
^ Задание области ограничения
Если для окна аплета задать область ограничения, то рисование будет возможно только в пределах этой области. Область ограничения задается методом clipRect, прототип которого мы привели ниже:
public abstract void clipRect(int x, int y, int width, int height);
Параметры x, y, width и height задают координаты прямоугольной области ограничения.
^ Копирование содержимого прямоугольной области
Метод copyArea позволяет скопировать содержимое любой прямоугольной области окна аплета:
public abstract void copyArea(int x, int y, int width, int height, int dx, int dy);
Параметры x, y, width и height задают координаты копируемой прямоугольной области. Область копируется в другую прямоугольную область такого же размера, причем параметры dx и dy определяют координаты последней.
^ Исходные тексты аплета Draw
Исходные тексты аплета Draw вы найдете в листинге 1.
Листинг 1. Файл draw.java
import java.applet.*;
import java.awt.*;
public class draw extends Applet
{
Toolkit tk;
String szFontList[];
FontMetrics fm;
int yStart = 20;
int yStep;
String parm_TestString;
public void init()
{
tk = Toolkit.getDefaultToolkit();
szFontList = tk.getFontList();
parm_TestString = getParameter("TestString");
}
public String getAppletInfo()
{
return "Name: draw";
}
public void paint(Graphics g)
{
int yDraw;
Dimension dimAppWndDimension = getSize();
g.clearRect(0, 0, dimAppWndDimension.width - 1, dimAppWndDimension.height - 1);
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);
fm = g.getFontMetrics();
yStep = fm.getHeight();
for(int i = 0; i < szFontList.length; i++)
{
g.setFont(new Font("Helvetica", Font.PLAIN, 12));
g.drawString(szFontList[i], 10, yStart + yStep * i);
fm = g.getFontMetrics();
yStep = fm.getHeight();
g.setFont(new Font(szFontList[i], Font.PLAIN, 12));
g.drawString(parm_TestString, 100, yStart + yStep * i);
}
yDraw = yStart + yStep * szFontList.length + yStep;
Polygon p = new Polygon();
p.addPoint(70, yDraw);
p.addPoint(150, yDraw + 30);
p.addPoint(160, yDraw + 80);
p.addPoint(190, yDraw + 60);
p.addPoint(140, yDraw + 30);
p.addPoint(70, yDraw + 39);
g.drawPolygon(p);
g.setColor(Color.red);
g.drawRect(10, yDraw + 85, 200, 100);
g.setColor(Color.black);
g.drawArc(10, yDraw + 85, 200, 100, -50, 320);
}
public String[][] getParameterInfo()
{
String[][] info =
{
{
"TestString", "String", "Test string"
}
};
return info;
}
}
^ Метод init
При инициализации аплета метод init извлекает список доступных шрифтов и принимает значение параметра TestString, передаваемое аплету в документе HTML.
^ Извлечение списка шрифтов
Процедура извлечения списка доступных шрифтов достаточно проста и выполняется следующим образом:
Toolkit tk;
String szFontList[];
. . .
tk = Toolkit.getDefaultToolkit();
szFontList = tk.getFontList();
Аплет вызывает статический метод getDefaultToolkit из класса Toolkit и затем, пользуясь полученной ссылкой, извлекает список шрифтов, записывая его в массив szFontList.
Для чего еще можно использовать класс Toolkit?
Класс Toolkit является абстрактным суперклассом для всех реализаций AWT. Порожденные от него классы используются для привязки различных компонент конкретных реализаций.
Создавая свои аплеты, вы будете редко прибегать к услугам этого класса. Однако в нем есть несколько полезных методов, прототипы которых мы перечислим ниже:
getDefaultToolkit
Получение ссылки на Toolkit
public static Toolkit getDefaultToolkit();
getColorModel
Определение текущей цветовой модели, выбранной в контекст отображения
public abstract ColorModel getColorModel();
getFontList
Получение списка шрифтов, доступных аплету
public abstract String[] getFontList();
getFontMetrics
Получение метрик заданного шрифта
public abstract FontMetrics
getFontMetrics(Font font);
getImage
Получение растрового изображения по имени файла
public abstract Image
getImage(String filename);
getImage
Получение растрового изображения по адресу URL
public abstract Image getImage(URL url);
getScreenResolution
Определение разрешения экрана в точках на дюйм
public abstract int getScreenResolution();
getScreenSize
Размеры экрана в пикселах
public abstract Dimension getScreenSize();
prepareImage
Подготовка растрового изображения для вывода
public abstract boolean prepareImage(Image image, int width, int height, ImageObserver observer);
sync
Синхронизация состояния Toolkit
public abstract void sync();
Наиболее интересны, с нашей точки зрения, методы getFontList, getScreenResolution и getScreenSize, с помощью которых аплет может, соответственно, получить список шрифтов, определить разрешение и размер экрана. Последние два параметра позволяют сформировать содержимое окна аплета оптимальным образом исходя из объема информации, который может в нем разместиться.
^ Получение значения параметров
До сих пор наши аплеты не получали параметров из документов HTML, в которые мы их встраивали.
Конечно, все константы, текстовые строки, адреса URL и другую информацию можно закодировать непосредственно в исходном тексте аплета, однако, очевидно, это очень неудобно.
Пользуясь операторами
, расположенными в документе HTML сразу после оператора , можно передать аплету произвольное количество параметров, например, в виде текстовых строк:
code=MyApplet.class
id=MyApplet
. . .
width=320
height=240 >
. . .
Здесь через параметр NAME оператора
передается имя параметра аплета, а через параметр VALUE - значение соответствующего параметра.
Как параметр может получить значение параметров?
Для получения значения любого параметра аплет должен использовать метод getParameter. В качестве единственного параметра этому методу передается имя параметра аплета в виде строки типа String, например:
parm_TestString = getParameter("TestString");
Обычно в аплете также определяется метод getParameterInfo, возвращающий информацию о параметрах. Вот исходный текст этого метода для нашего аплета Draw:
public String[][] getParameterInfo()
{
String[][] info =
{
{
"TestString", "String", "Test string"
}
};
return info;
}
Метод getParameterInfo возвращает массив массивов текстовых строк. Первая строка указывает имя параметра, вторая - тип передаваемых через него данных, а третья - значение параметра по умолчанию.
^ Метод paint
Первым делом метод paint определяет размеры окна аплета, вызывая для этого метод getSize:
Dimension dimAppWndDimension = getSize();
Метод getSize возвращает ссылку на объект класса Dimension, хранящий высоту и ширину объекта:
height
Высота
public int height;
width
Ширина
public int width;
В классе Dimension предусмотрено три конструктора и один метод:
public Dimension();
public Dimension(Dimension d);
public Dimension(int width, int height);
toString
Получение строки, представляющей класс
public String toString();
После определения размеров окна аплета метод paint стирает содержимое всего окна:
g.clearRect(0, 0,
dimAppWndDimension.width - 1,
dimAppWndDimension.height - 1);
Далее в контексте отображения устанавливается желтый цвет:
g.setColor(Color.yellow);
Этим цветом заполняется внутренняя область окна аплета, для чего применяется метод fillRect:
g.fillRect(0, 0,
dimAppWndDimension.width - 1,
dimAppWndDimension.height - 1);
Затем метод paint устанавливает в контексте отображения черный цвет и рисует тонкую черную рамку вокруг окна аплета:
g.setColor(Color.black);
g.drawRect(0, 0,
dimAppWndDimension.width - 1,
dimAppWndDimension.height - 1);
На следующем этапе мы получаем метрики текущего шрифта, выбранного в контекст отображения:
fm = g.getFontMetrics();
Пользуясь этими метриками, мы определяем высоту символов текущего шрифта и записываем ее в поле yStep:
yStep = fm.getHeight();
После этого метод paint запускает цикл по всем шрифтам, установленным в системе:
for(int i = 0; i < szFontList.length; i++)
{
. . .
}
Количество доступных шрифтов равно размеру массива szFontList, которое вычисляется как szFontList.length.
Метод paint выписывает в окне аплета название каждого шрифта, устанавливая для этого шрифт Helvetica размером 12 пикселов:
g.setFont(new Font("Helvetica", Font.PLAIN, 12));
g.drawString(szFontList[i], 10, yStart + yStep * i);
Смещение каждой новой строки с названием шрифта вычисляется исходя из высоты символов установленного шрифта:
fm = g.getFontMetrics();
yStep = fm.getHeight();
После названия шрифта метод paint рисует в окне аплета текстовую строку parm_TestString, полученную через параметр с именем "TestString":
g.setFont(new Font(szFontList[i], Font.PLAIN, 12));
g.drawString(parm_TestString, 100, yStart + yStep * i);
Перед тем как перейти к рисованию геометрических фигур, метод paint запоминает в поле yDraw координату последней строки названия шрифта, сделав отступ высотой yStep :
int yDraw;
yDraw = yStart + yStep * szFontList.length + yStep;
Первая фигура, которую рисует наш аплет, это многоугольник.
Мы создаем многоугольник как объект класса Polygon:
Polygon p = new Polygon();
В этот объект при помощи метода addPoint добавляется несколько точек:
p.addPoint(70, yDraw);
p.addPoint(150, yDraw + 30);
p.addPoint(160, yDraw + 80);
p.addPoint(190, yDraw + 60);
p.addPoint(140, yDraw + 30);
p.addPoint(70, yDraw + 39);
После добавления всех точек метод paint рисует многоугольник, вызывая для этого метод drawPolygon:
g.drawPolygon(p);
Затем мы устанавливаем в контексте отображения красный цвет и рисуем прямоугольник:
g.setColor(Color.red);
g.drawRect(10, yDraw + 85, 200, 100);
Затем метод paint вписывает в этот прямоугольник сегмент окружности:
g.setColor(Color.black);
g.drawArc(10, yDraw + 85, 200, 100, -50, 320);
^ Документ HTML для аплета Draw
Документ HTML для аплета Draw не имеет никаких особенностей. Он представлен в листинге 2.
Листинг 2. Файл draw.tmp.html
name="draw" code="draw" codebase="file:/e:/Sun/Articles/vol4/src/draw" width="250" height="350"
align="Top" alt="If you had a java-enabled browser, you would see an applet here.">
If your browser recognized the applet tag,
you would see an applet here.
^ Как обрабатываются события
Когда возникает событие, управление получает метод handleEvent из класса Component. Класс Applet является дочерним по отношению к классу Component.
Прототип метода handleEvent мы привели ниже:
public boolean handleEvent(Event evt);
В качестве параметра методу handleEvent передается объект класса Event, который содержит всю информацию о событии. По содержимому полей класса Event вы можете определить координаты курсора мыши в момент, когда пользователь нажал клавишу, отличить одинарный щелчок от двойного и так далее.
Ниже мы привели список полей класса Event, которые вы можете проанализировать:
Поле
Описание
public Object argarg;
Произвольный аргумент события, значение которого зависит от типа события
public int clickCountclickCount;
Это поле имеет значение только для события с типом MOUSE_DOWNMOUSE_DOWN и содержит количество нажатий на клавишу мыши. Если пользователь сделал двойной щелчок мышью, в это поле будет записано значение 2
public Event evtevt;
Следующее событие в связанном списке
public int idid;
Тип события. Ниже мы перечислим возможные значения для этого поля
public int keykey;
Код нажатой клавиши (только для события, созданного при выполнении пользователем операции с клавиатурой)
public int modifiersmodifiers;
Состояние клавиш модификации , ,
public Object targettarget;
Компонент, в котором произошло событие
public long whenwhen;
Время, когда произошло событие
public int xx;
Координата по оси X
public int yy;
Координата по оси Y
Поле id (тип события) может содержать следующие значения:
Значение
Тип события
ACTION_EVENTACTION_EVENT
Пользователь хочет, чтобы произошло некоторое событие
GOT_FOCUSGOT_FOCUS
Компонент (в нашем случае окно аплета) получил фокус ввода. О фокусе ввода вы узнаете из раздела, посвященного работе с клавиатурой
KEY_ACTIONKEY_ACTION
Пользователь нажал клавишу типа "Action"
KEY_ACTION_RELEASEKEY_ACTION_RELEASE
Пользователь отпустил клавишу типа "Action"
KEY_PRESSKEY_PRESS
Пользователь нажал обычную клавишу
KEY_RELEASEKEY_RELEASE
Пользователь отпустил обычную клавишу
LIST_DESELECTLIST_DESELECT
Отмена выделения элемента в списке
LIST_SELECTLIST_SELECT
Выделение элемента в списке
LOAD_FILELOAD_FILE
Загрузка файла
LOST_FOCUSLOST_FOCUS
Компонент потерял фокус ввода
MOUSE_DOWNMOUSE_DOWN
Пользователь нажал клавишу мыши
MOUSE_DRAGMOUSE_DRAG
Пользователь нажал клавишу мыши и начал выполнять перемещение курсора мыши
MOUSE_ENTERMOUSE_ENTER
Курсор мыши вошел в область окна аплета
MOUSE_EXITMOUSE_EXIT
Курсор мыши покинул область окна аплета
MOUSE_MOVEMOUSE_MOVE
Пользователь начал выполнять перемещение курсора мыши, не нажимая клавишу мыши
MOUSE_UPMOUSE_UP
Пользователь отпустил клавишу мыши
SAVE_FILESAVE_FILE
Сохранение файла
SCROLL_ABSOLUTESCROLL_ABSOLUTE
Пользователь переместил движок полосы просмотра в новую позицию
SCROLL_LINE_DOWNSCROLL_LINE_DOWN
Пользователь выполнил над полосой просмотра операцию сдвига на одну строку вниз
SCROLL_LINE_UPSCROLL_LINE_UP
Пользователь выполнил над полосой просмотра операцию сдвига на одну строку вверх
SCROLL_PAGE_DOWNSCROLL_PAGE_DOWN
Пользователь выполнил над полосой просмотра операцию сдвига на одну страницу вниз
SCROLL_PAGE_UPSCROLL_PAGE_UP
Пользователь выполнил над полосой просмотра операцию сдвига на одну страницувверх
WINDOW_DEICONIFYWINDOW_DEICONIFY
Пользователь
еще рефераты
Еще работы по разное