Microsoft Visual J++. Создание приложений и аплетов на языке Java. Часть 1© Александр Фролов, Григорий ФроловТом 30, М.: Диалог-МИФИ, 1997, 288 стр. Контекст отображенияСпособ, которым аплет выполняет рисование в своем окне, полностью отличается от того, которым пользуются программы MS-DOS. Вместо того чтобы обращаться напрямую или через драйвер к регистрам видеоконтроллера, аплет пользуется методами из класса Graphics. Эти методы инкапсулируют все особенности аппаратуры, предоставляя в распоряжение программиста платформно-независимое средство рисования. Для окна аплета создается объект класса Graphics, ссылка на который передается методу paint. В предыдущей главе мы уже пользовались этим объектом, вызывая для него метод drawString, рисующий в окне текстовую строку. Объект, ссылка на который передается методу paint, и есть контекст отображения. Сейчас мы займемся контекстом отображения вплотную. Полотно для рисованияПроще всего представить себе контекст отображения как полотно, на котором рисует художник. Точно так же как художник может выбирать для рисования различные инструменты, программист, создающий аплет Java, может выбирать различные методы класса Graphics и задавать различные атрибуты контекста отображения. Методы класса GraphicsВ качестве базового для класса Graphics (полное название класса java.awt.Graphics) выступает классс java.lang.Object. В виду важности класса Graphics мы приведем его определение с комментариями: public abstract class java.awt.Graphics extends java.lang.Object { // ----------------------------------------------------- // Конструктор // ----------------------------------------------------- protected Graphics(); // ----------------------------------------------------- // Методы // ----------------------------------------------------- // Стирание содержимого прямоугольной области public abstract void clearRect(int x, int y, int width, int height); // Задание области ограничения вывода public abstract void clipRect(int x, int y, int width, int height); // Копирование содержимого прямоугольной области public abstract void copyArea(int x, int y, int width, int height, int dx, int dy); // Создание контекста отображения public abstract Graphics create(); // Создание контекста отображения public Graphics create(int x, int y, int width, int height); // Удаление контекста отображения public abstract void dispose(); // Рисование прямоугольной области с трехмерным // выделением public void draw3DRect(int x, int y, int width, int height, boolean raised); // Рисование сегмента public abstract void drawArc(int x, int y, int width, int height, int startAngle, int arcAngle); // Рисование текста из массива байт public void drawBytes(byte data[], int offset, int length, int x, int y); // Рисование текста из массива символов public void drawChars(char data[], int offset, int length, int x, int y); // Рисование растрового изображения 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); // Рисование линии public abstract void drawLine(int x1, int y1, int x2, int y2); // Рисование овала public abstract void drawOval(int x, int y, int width, int height); // Рисование многоугольника public abstract void drawPolygon(int xPoints[], int yPoints[], int nPoints); // Рисование многоугольника public void drawPolygon(Polygon p); // Рисование прямоугольника public void drawRect(int x, int y, int width, int height); // Рисование прямоугольника с круглыми углами public abstract void drawRoundRect(int x, int y, int width, int height, int arcWidth, int arcHeight); // Рисование текстовой строки public abstract void drawString(String str, int x, int y); // Рисование заполненного прямоугольника с // трехмерным выделением public void fill3DRect(int x, int y, int width, int height, boolean raised); // Рисование заполненного сегмента круга public abstract void fillArc(int x, int y, int width, int height, int startAngle, int arcAngle); // Рисование заполненного овала public abstract void fillOval(int x, int y, int width, int height); // Рисование заполненного многоугольника public abstract void fillPolygon(int xPoints[], int yPoints[], int nPoints); // Рисование заполненного многоугольника public void fillPolygon(Polygon p); // Рисование заполненного прямоугольника public abstract void fillRect(int x, int y, int width, int height); // Рисование заполненного прямоугольника // с круглыми углами public abstract void fillRoundRect(int x, int y, int width, int height, int arcWidth, int arcHeight); // Прослеживание вызова метода dispose public void finalize(); // Определение границ области ограничения вывода public abstract Rectangle getClipRect(); // Определение цвета, выбранного в контекст отображения public abstract Color getColor(); // Определение шрифта, выбранного в контекст отображения public abstract Font getFont(); // Определение метрик текущего шрифта public FontMetrics getFontMetrics(); // Определение метрик заданного шрифта public abstract FontMetrics getFontMetrics(Font f); // Установка цвета для рисования в контексте отображения public abstract void setColor(Color c); // Установка текущего шрифта в контексте отображения public abstract void setFont(Font font); // Установка режима рисования public abstract void setPaintMode(); // Установка маски для рисования public abstract void setXORMode(Color c1); // Получение текстовой строки, представляющей // данный контекст отображения public String toString(); // Сдвиг начала системы координат // в контексте отображения public abstract void translate(int x, int y); } Рассмотрим назначение основных методов, сгруппировав их по выполняемым функциям. Установка атрибутов контекста отображенияИзменяя атрибуты контекста отображения, приложение Java может установить цвет для рисования графических изображений, таких как линии и многоугольники, шрифт для рисования текста, режим рисования и маску. Возможен также сдвиг начала системы координат. Выбор цветаИзменение цвета, выбранного в контекст отображения, выполняется достаточно часто. В классе Graphics для изменения цвета определен метод setColor, прототип которого представлен ниже: public abstract void setColor(Color c); В качестве параметра методу setColor передается ссылка на объект класса Color, с помощью которого можно выбрать тот или иной цвет. Как задается цвет? Для этого можно использовать несколько способов. Прежде всего, вам доступны статические объекты, определяющие фиксированный набор основных цветов:
Этим набором цветов пользоваться очень просто: public void paint(Graphics g) { // Выбираем в контекст отображения желтый цвет g.setColor(Color.yellow); g.drawString("Привет из аплета!", 10, 20); . . . } Здесь мы привели фрагмент исходного текста метода paint, в котором в контексте отображения устанавливается желтый цвет. После этого метод drawString выведет текстовую строку "Привет из аплета!" желтым цветом. Если необходима более точная установка цвета, вы можете воспользоваться одним из трех конструкторов объекта 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 определено еще несколько методов, которые могут оказаться вам полезными:
Второй способ установки цвето фона и изображения заключается в вызове методов setBackground и setForeground, например: setBackground(Color.yellow); setForeground(Color.black); Здесь мы устанавливаем для окна аплета желтый цвет фона и черный цвет изображения. Выбор шрифтаС помощью метода setFont из класса Graphics вы можете выбрать в контекст отображения шрифт, который будет использоваться методами drawString, drawBytes и drawChars для рисования текста. Вот прототип метода setFont: public abstract void setFont(Font font); В качестве параметра методу setFont следует передать объект класса Font: public class java.awt.Font extends java.lang.Object { // ----------------------------------------------------- // Поля класса // ----------------------------------------------------- protected String name; protected int size; protected int style; // Битовые маски стиля шрифта public final static int BOLD; public final static int ITALIC; public final static int PLAIN // ----------------------------------------------------- // Конструктор // ----------------------------------------------------- public Font(String name, int style, int size); // ----------------------------------------------------- // Методы // ----------------------------------------------------- // Сравнение шрифтов public boolean equals(Object obj); // Определение названия семейства шрифтов public String getFamily(); // Получение шрифта по его характеристикам public static Font getFont(String nm); public static Font getFont(String nm, Font font); // Определение названия шрифта public String getName(); // Определение размера шрифта public int getSize(); // Определение стиля шрифта public int getStyle(); // Получение хэш-кода шрифта public int hashCode(); // Определение жирности шрифта public boolean isBold(); // Проверка, является ли шрифт наклонным public boolean isItalic(); // Проверка, есть ли шрифтовое выделение public boolean isPlain(); // Плучение текстовой строки для объекта public String toString(); } Создавая шрифт конструктором Font, вы должны указать имя, стиль и размер шрифта. В качестве имени можно указать, например, строки Arial или Courier. Учтите, что в системе удаленного пользователя, загрузившего ваш аплет, может не найтись шрифта с указанным вами именем. В этом случае навигатор заменит его на наиболее подходящий (с его точки зрения). Стиль шрифта задается масками BOLD, ITALIC и PLAIN, которые можно комбинировать при помощи логической операции “ИЛИ”:
Что же касается размера шрифта, то он указывается в пикселах. Установка режима рисованияМетод setPaintMode устанавливает в контексте отображения режим рисования, при котором выполняется замещение изображения текущим цветом, установленном в контексте отображения. Прототип метода setPaintMode приведен ниже: public abstract void setPaintMode(); Установка маски для рисованияЗадавая маску для рисования при помощи метода setXORMode, вы можете выполнить при рисовании замещение текущего цвета на цвет, указанный в параметре метода, и наоборот, цвета, указанного в параметре метода, на текущий. Все остальные цвета изменяются непредсказуемым образом, однако эта операция обратима, если вы нарисуете ту же самую фигуру два раза на одном и том же месте. Прототип метода setXORMode: public abstract void setXORMode(Color c1); Сдвиг начала системы координатМетод translate сдвигает начало системы координат в контексте отображения таким образом, что оно перемещается в точку с координатами (x, y), заданными через параметры метода: public abstract void translate(int x, int y); Определение атрибутов контекста отображенияРяд методов класса 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. Ниже мы привели список наиболее важных методов этого класса, предназначенных для получения отдельных параметров шрифта:
Обратите внимание на метод 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), как это показано на рис. 3.1. Рис. 3.1. Рисование прямой линии К сожалению, в контексте отображения не предусмотерны никакие атрибуты, позволяющие назрисовать пунктирную линию или линию увеличенной толщины. Прямоугольники и квадратыСреди методов класса Graphics есть несколько, предназначенных для рисования прямоугольников. Первый из них, с именем drawRect, позволяет нарисовать прямоугольник, заданный координатами своего левого вернего угла, шириной и высотой: public void drawRect(int x, int y, int width, int height); Параметры x и y задают, соответственно, координаты верхнего левого угла, а параметры width и height - высоту и ширину прямоугольника (рис. 3.2). Рис. 3.2. Рисование прямоугольника В отличие от метода drawRect, рисующего только прямоугольную рамку, метод fillRect рисует заполненный прямоугольник. Для рисования и заполнения прямоугольника используется цвет, выбранный в контекст отображения (рис. 3.3). Прототип метода fillRect приведен ниже: public abstract void fillRect(int x, int y, int width, int height); Рис. 3.3. Рисование заполненного прямоугольника Метод drawRoundRect позволяет нарисовать прямоугольник с закругленными углами: public abstract void drawRoundRect(int x, int y, int width, int height, int arcWidth, int arcHeight); Параметры x и y определяют координаты верхнего левого угла прямоугольника, параметры width и height задают, соответственно его ширину и высоту. Размеры эллипса, образующего закругления по углам, вы можете задать с помощью параметров arcWidth и arcHeight. Первый из них задает ширину эллипса, а второй - высоту (рис. 3.4). Рис. 3.4. Рисование прямоугольника с закругленными углами Метод fillRoundRect позволяет нарисовать заполненный прямоугольник с закругленными углами (рис. 3.5). Назначение параметров этого метода аналогично назначению параметров только что рассмотренного метода drawRoundRect: public abstract void fillRoundRect(int x, int y, int width, int height, int arcWidth, int arcHeight); Рис. 3.5. Рисование заполненного прямоугольника с закругленными углами Метод 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 задает количество точек в массивах. На рис. 3.6 показан многоугольник, нарисованный методом drawPolygon. Рис. 3.6. Многоугольник, нарисованный методом drawPolygon В этом многоугольнике шесть вершин с координатами от (x0, y0) до (x5, y5), причем для того чтобы он стал замкнутым,координаты первой и последней вершины совпадают. Второй метод также рисует незаполненный многоугольник, однако в качетсве параметра методу передается ссылка на объект Polygon: public void drawPolygon(Polygon p); Класс Polygon достаточно прост, поэтому мы приведем его описание полностью: public class java.awt.Polygon extends java.lang.Object { // ----------------------------------------------------- // Поля класса // ----------------------------------------------------- public int npoints; // количество вершин public int xpoints[]; // массив координат по оси X public int ypoints[]; // массив координат по оси Y // ----------------------------------------------------- // Конструкторы // ----------------------------------------------------- public Polygon(); public Polygon(int xpoints[], int ypoints[], int npoints); // ----------------------------------------------------- // Методы // ----------------------------------------------------- // Добавление вершины public void addPoint(int x, int y); // Получение координат охватывающего прямоугольника public Rectangle getBoundingBox(); // Проверка, находится ли точка внутри многоугольника 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); Если вам нужно нарисовать заполненный многоугольник (рис. 3.7), то для этого вы можете воспользоваться методами, приведенными ниже: public abstract void fillPolygon(int xPoints[], int yPoints[], int nPoints); public void fillPolygon(Polygon p); Первый из этих методов рисует многоугольник, координаты вершин которого заданы в массивах, второй - получая объект класса Polygon в качестве параметра. Рис. 3.6. Многоугольник, нарисованный методом drawPolygon Овалы и кругиДля рисования окружностей и овалов вы можете воспользоваться методом drawOval: public abstract void drawOval(int x, int y, int width, int height); Параметры этого методы задают координаты и размеры прямоугольника, в который вписывается рисуемый овал (рис. 3.7). Рис. 3.7. Рисование овала Метод fillOval предназначен для рисования заполненного овала (рис. 3.8). Назначение его параметров аналогично назначению параметров метода drawOval: public abstract void fillOval(int x, int y, int width, int height); Рис. 3.7. Рисование заполненного овала СегментыМетод drawArc предназначен для рисования незаполненного сегмента (рис. 3.8). Прототип этого метода приведен ниже: public abstract void drawArc(int x, int y, int width, int height, int startAngle, int arcAngle); Рис. 3.8. Рисование незаполненного сегмента Параметры 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 определяют координаты последней. |