Аплет Draw
Аплет Draw
Аплет Draw
В этом разделе мы приведем исходные тексты аплета Draw, в которых демонстрируется использование различных функций рисования.
На Рисунок 11 показано окно этого аплета.
Битовые маски стиля шрифта
Битовые маски стиля шрифта
BOLD public final static int BOLD; ITALIC public final static int ITALIC; PLAIN
public final static int PLAIN;
Документ HTML для аплета Draw
Документ HTML для аплета Draw
Документ HTML для аплета Draw не имеет никаких особенностей. Он представлен в листинге 2.
Листинг 2. Файл draw.tmp.html
<applet 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." > <param name="TestString" value="Test string"> <hr>If your browser recognized the applet tag, you would see an applet here.<hr> </applet>Исходные тексты
Исходные тексты
Исходные тексты аплета Draw
Исходные тексты аплета Draw
Исходные тексты аплета Draw вы найдете в листинге 1.
Извлечение списка шрифтов
Извлечение списка шрифтов
Процедура извлечения списка доступных шрифтов достаточно проста и выполняется следующим образом:
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, с помощью которых аплет может, соответственно, получить список шрифтов, определить разрешение и размер экрана. Последние два параметра позволяют сформировать содержимое окна аплета оптимальным образом исходя из объема информации, который может в нем разместиться.
Класс Font
Класс Font
Приведем краткое перечисление полей, конструкторов и методов этого класса.
Конструктор
Конструктор
Graphics protected Graphics();
Конструкторы
Конструкторы
public Polygon (); public Polygon(int xpoints[], int ypoints[], int npoints);
Контекст отображения
Контекст отображения
Проще всего представить себе контекст отображения как полотно, на котором рисует художник. Точно так же как художник может выбирать для рисования различные инструменты, программист, создающий аплет Java, может выбирать различные методы класса Graphics и задавать различные атрибуты контекста отображения.
Копирование содержимого прямоугольной области
Копирование содержимого прямоугольной области
Метод copyArea позволяет скопировать содержимое любой прямоугольной области окна аплета:
public abstract void copyArea( int x, int y, int width, int height, int dx, int dy);Параметры x, y, width и height задают координаты копируемой прямоугольной области. Область копируется в другую прямоугольную область такого же размера, причем параметры dx и dy определяют координаты последней.
Линии
Линии
Для того чтобы нарисовать прямую тонкую сплошную линию, вы можете воспользоваться методом drawLine, прототип которого приведен ниже:
public abstract void drawLine(int x1, int y1,int x2, int y2);Концы линии имеют координаты (x1, y1) и (x2, y2), как это показано наРисунок 1.
public class draw extends Applet
Листинг 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
При инициализации аплета метод init извлекает список доступных шрифтов и принимает значение параметра TestString, передаваемое аплету в документе HTML.
Метод paint
Метод 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);Методы
Методы
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();Методы класса Graphics
Методы класса Graphics
В качестве базового для класса Graphics (полное название класса java.awt.Graphics) выступает класс java.lang.Object.
Прежде всего мы приведем прототипы конструктора этого класса и его методов с краткими комментариями. Полное описание вы сможете найти в электронной документации, которая входит в комплект Java WorkShop.
Далее мы рассмотрим назначение основных методов, сгруппировав их по выполняемым функциям.
Методы
Методы
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 | Шрифтовое выделение не используется |
Что же касается размера шрифта, то он указывается в пикселах.
Методы
Методы
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 в качестве параметра.
Многоугольники
Многоугольники
Для рисования многоугольников в классе Graphics предусмотрено четыре метода, два из которых рисуют незаполненные многоугольники, а два - заполненные.
Первый метод рисует незаполненный многоугольник, заданный массивами координат по осям X и Y:
public abstract void drawPolygon( int xPoints[], int yPoints[], int nPoints);Через параметры xPoints и yPoints передаются, соответственно, ссылки на массивы координат по оис X и Y. Параметр nPoints задает количество точек в массивах.
На Рисунок 6 показан многоугольник, нарисованный методом drawPolygon.
Определение атрибутов
Определение атрибутов
Определение атрибутов контекста отображения
Определение атрибутов контекста отображения
Ряд методов класса Graphics позволяет определить различные атрибуты контекста отображения, например, цвет, выбранный в контекст отображения или метрики текущего шрифта, которым выполняется рисование текста.
Рассмотрим методы, позволяющие определить атрибуты контекста отображения.
Определение цвета выбранного в контекст отображения
Определение цвета, выбранного в контекст отображения
Метод getColor возвращает ссылку на объект класса Color, представляющий текущий цвет, выбранный в контекст отображения:
public abstract Color getColor();Определение границ области ограничения вывода
Определение границ области ограничения вывода
С помощью метода clipRect, о котором мы расскажем чуть позже, вы можете определить в окне аплета область ограничения вывода прямоугольной формы. Вне этой области рисование графических изображений и текста не выполняется.
Метод getClipRect позволяет вам определить координаты текущей области ограничения, заданной в контексте отображения:
public abstract Rectangle getClipRect();Метод возвращает ссылку на объект класса Rectangle, который, в частности, имеет поля класса с именами x, y, height и width. В этих полях находится, соответственно, координаты верхнего левого угла, высота и ширина прямоугольной области.
Определение метрик текущего шрифта
Определение метрик текущего шрифта
Несмотря на то что вы можете заказать шрифт с заданным именем и размером, не следует надеяться, что навигатор выделит вам именно такой шрифт, какой вы попросите. Для правильного размещения текста и других изображений в окне аплета вам необходимо знать метрики реального шрифта, выбранного навигатором в контекст отображения.
Метрики текущего шрифта в контексте отображения вы можете узнать при помощи метода 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 без параметров возвращает метрики текущего шрифта, выбранного в контекст отображения.
Определение шрифта выбранного в контекст отображения
Определение шрифта, выбранного в контекст отображения
С помощью метода getFont, возвращающего ссылку на объект класса Font, вы можете определить текущий шрифт, выбранный в контекст отображения:
public abstract Font getFont();Овалы и круги
Овалы и круги
Для рисования окружностей и овалов вы можете воспользоваться методом drawOval:
public abstract void drawOval( int x, int y, int width, int height);Параметры этого методы задают координаты и размеры прямоугольника, в который вписывается рисуемый овал (Рисунок 8).
Поля класса
Поля класса
name protected String name; size protected int size; style protected int style;
Поля класса
npoints
Количество вершин
public int npoints; xpointsМассив координат по оси X
public int xpoints[]; ypointsМассив координат по оси Y
public int ypoints[]Получение значения параметров
Получение значения параметров
До сих пор наши аплеты не получали параметров из документов HTML, в которые мы их встраивали.
Конечно, все константы, текстовые строки, адреса URL и другую информацию можно закодировать непосредственно в исходном тексте аплета, однако, очевидно, это очень неудобно.
Пользуясь операторами <PARAM>, расположенными в документе HTML сразу после оператора <APPLET>, можно передать аплету произвольное количество параметров, например, в виде текстовых строк:
<applet code=MyApplet.class id=MyApplet . . . width=320 height=240 > <param name=ParamName1 value="Value 1"> <param name=ParamName2 value="Value 2"> <param name=ParamName3 value="Value 3"> <param name=ParamName4 value="Value 4"> . . . </applet>Здесь через параметр NAME оператора <PARAM> передается имя параметра аплета, а через параметр VALUE - значение соответствующего параметра.
Как параметр может получить значение параметров?
Для получения значения любого параметра аплет должен использовать метод getParameter. В качестве единственного параметра этому методу передается имя параметра аплета в виде строки типа String, например:
parm_TestString = getParameter("TestString");Обычно в аплете также определяется метод getParameterInfo, возвращающий информацию о параметрах. Вот исходный текст этого метода для нашего аплета Draw:
public String[][] getParameterInfo() { String[][] info = { { "TestString", "String", "Test string" } }; return info; }Метод getParameterInfo возвращает массив массивов текстовых строк. Первая строка указывает имя параметра, вторая - тип передаваемых через него данных, а третья - значение параметра по умолчанию.
Прямоугольники и квадраты
Прямоугольники и квадраты
Среди методов класса Graphics есть несколько, предназначенных для рисования прямоугольников. Первый из них, с именем drawRect, позволяет нарисовать прямоугольник, заданный координатами своего левого верхнего угла, шириной и высотой:
public void drawRect(int x, int y, int width, int height);Параметры x и y задают, соответственно, координаты верхнего левого угла, а параметры width и height - высоту и ширину прямоугольника (Рисунок 2).
Проект аплета
Проект аплета
Проект для аплета Draw
Проект для аплета Draw
Подготовьте файлы проекта аплета Draw, скопировав их из предыдущего раздела в какой-нибудь каталог. Затем запустите мастер проектов и в соответствующей диалоговой панели укажите путь к этому каталогу (Рисунок 12).
Рисование фигур
Рисование фигур
Рисование геометрических фигур
Рисование геометрических фигур
В этом разделе мы опишем методы класса Graphics, предназначенные для рисования элементарных геометрических фигур, таких как линии, прямоугольники, окружности и так далее.
Рисование в окне аплета
Рисование в окне аплета
В предыдущем разделе мы привели простейший пример аплета, который выполняет рисование текстовой строки в своем окне. Теперь мы расскажем вам о том, что и как может рисовать аплет.
Способ, которым аплет выполняет рисование в своем окне, полностью отличается от того, которым пользуются программы MS-DOS. Вместо того чтобы обращаться напрямую или через драйвер к регистрам видеоконтроллера, аплет пользуется методами из класса Graphics. Эти методы инкапсулируют все особенности аппаратуры, предоставляя в распоряжение программиста средство рисования, которое пригодно для любой компьютерной платформы.
Для окна аплета создается объект класса Graphics, ссылка на который передается методу paint. Раньше мы уже пользовались этим объектом, вызывая для него метод drawString, рисующий в окне текстовую строку. Объект, ссылка на который передается методу paint, и есть контекст отображения. Сейчас мы займемся контекстом отображения вплотную.
Рисование прямой линии
Рисунок 1. Рисование прямой линии
К сожалению, в контексте отображения не предусмотрены никакие атрибуты, позволяющие нарисовать пунктирную линию или линию увеличенной толщины.
Рисование прямоугольника
Рисунок 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.
Многоугольник нарисованный методом drawPolygon
Рисунок 6. Многоугольник, нарисованный методом drawPolygon
В этом многоугольнике шесть вершин с координатами от (x0,y0) до (x5, y5), причем для того чтобы он стал замкнутым, координаты первой и последней вершины совпадают.
Второй метод также рисует незаполненный многоугольник, однако в качестве параметра методу передается ссылка на объект Polygon:
public void drawPolygon(Polygon p);Класс Polygon достаточно прост. Приведем описание его полей, конструкторов и методов:
Многоугольник нарисованный методом fillPolygon
Рисунок 7. Многоугольник, нарисованный методом fillPolygon
Рисование овала
Рисунок 8. Рисование овала
Метод fillOval предназначен для рисования заполненного овала (Рисунок 9). Назначение его параметров аналогично назначению параметров метода drawOval:
public abstract void fillOval( int x, int y, int width, int height);Рисование заполненного овала
Рисунок 9. Рисование заполненного овала
Рисование незаполненного сегмента
Рисунок 10. Рисование незаполненного сегмента
Параметры x, y, width и height задают координаты прямоугольника, в который вписан сегмент.
Параметры startAngle и arcAngle задаются в градусах. Они определяют, соответственно, начальный угол и угол разворота сегмента.
Для того чтобы нарисовать заполненный сегмент, вы можете воспользоваться методом fillArc:
public abstract void fillArc(int x, int y, int width, int height, int startAngle, int arcAngle);Окно аплета Draw
Рисунок 11. Окно аплета Draw
В верхней части окна мы вывели список вех шрифтов, доступных аплету, а также примеры оформления строки Test string с использованием этих шрифтов.
В нижней части окна нарисовано несколько геометрических фигур.
Указание пути к каталогу
Рисунок 12. Указание пути к каталогу с исходными файлами
Для того чтобы увидеть рисунок в увеличенном виде, сделайте щелчок мышью по изображению
Так как в каталоге уже есть файлы, вы должны включить переключатель Yes и затем нажать кнопку Next.
После этого вы увидите на экране диалоговую панель, показанную на Рисунок 13.
Указание пути к каталогу с исходными файлами
Рисунок 12. Указание пути к каталогу с исходными файлами
Добавление к проекту
Рисунок 13. Добавление к проекту существующих файлов
Для того чтобы увидеть рисунок в увеличенном виде, сделайте щелчок мышью по изображению
Здесь вам нужно нажать кнопку Add All in Directory. Как только вы это сделаете, в списке файлов Project Files появится имя файла draw.java, подготовленного вами заранее.
На следующем шаге вам опять нужно нажать кнопку Next и проследить, чтобы имя главного класса аплета, отображаемое в диалоговой панели, показанной на Рисунок 14, было draw.
Добавление к проекту существующих файлов
Рисунок 13. Добавление к проекту существующих файлов
Задание имени главного
Рисунок 14. Задание имени главного класса
Для того чтобы увидеть рисунок в увеличенном виде, сделайте щелчок мышью по изображению
Нажав кнопку Finish, вы можете завершить формирование проекта.
Hаш аплет принимает из документа HTML один параметр с именем TestString. Для добавления параметров вам нужно открыть окно менеджера проектов, выбрав из меню Project строку Show Project Manager. В этом окне проект draw должен быть текущим.
Выделите его курсором мыши в окне Java WorkShop Project Manager и из меню Project этого окна выберите строку Edit. Вы увидите блокнот Project Edit, с помощью которого можно изменять различные параметры проекта. Откройте в этом блокноте страницу Run (Рисунок 15).
Задание имени главного класса
Рисунок 14. Задание имени главного класса
Добавление параметра
Рисунок 15. Добавление параметра TestString
Для того чтобы увидеть рисунок в увеличенном виде, сделайте щелчок мышью по изображению
В полях Name и Value введите, соответственно, имя параметра и значение параметра по умолчанию, а затем нажмите кнопку Add. Добавленный вами параметр появится в списке Parameters. Теперь вам осталось только нажать кнопку OK.
Добавление параметра TestString
Рисунок 15. Добавление параметра TestString
Сегменты
Сегменты
Метод drawArc предназначен для рисования незаполненного сегмента (Рисунок 10). Прототип этого метода приведен ниже:
public abstract void drawArc( int x, int y, int width, int height, int startAngle, int arcAngle);Установка атрибутов
Установка атрибутов
Установка атрибутов контекста отображения
Установка атрибутов контекста отображения
Изменяя атрибуты контекста отображения, приложение 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.
Задание области ограничения
Задание области ограничения
Если для окна аплета задать область ограничения, то рисование будет возможно только в пределах этой области. Область ограничения задается методом clipRect, прототип которого мы привели ниже:
public abstract void clipRect( int x, int y, int width, int height);Параметры x, y, width и height задают координаты прямоугольной области ограничения.