Малювання фігур засобами Java 2D
Характеристики пера для малювання фігур описані в інтерфейсі Stroke. У Java 2D є поки що лише один клас, що реалізує цей інтерфейс, - клас BasicStroke.
Клас BasicStroke
Конструктори класу BasicStroke визначають параметри пера. Основний конструктор,
BasicStroke(float width, int cap, int join, float miter, float[] dash, float dashBegin);
товщину пера width у пікселах;
оформлення кінця лінії cap; це одна з констант:
CAP_ROUND - закруглений кінець лінії;
CAP_SQUARE – квадратний кінець лінії;
CAP_BUTT - оформлення відсутнє;
Частина ІІІ. Створення графічного інтерфейсу користувача та аплетів
спосіб сполучення ліній join; це одна з констант:
JOIN_ROUND - лінії сполучаються дугою кола;
JOIN_BEVEL - лінії сполучаються відрізком прямий, перпендикулярним бісектрисі кута між лініями;
JOIN_MITER - лінії просто стикуються;
відстань між лініями miter, починаючи з якої застосовується поєднання
довжину штрихів і проміжків між штрихами - масив dash; елементи масиву з парними індексами задають довжину штриха у пікселах, елементи з непарними індексами – довжину проміжку; масив перебирається циклічно;
індекс dashBegin, починаючи з якого перебираються елементи масиву dash. Інші конструктори задають деякі характеристики за замовчуванням:
BasicStroke (float width, int cap, int join, float miter) - суцільна лінія;
BasicStroke(float width, int cap, int join) - суцільна лінія з поєднанням JOIN_ROUND або JOIN_BEVEL ; для сполучення JOIN_MITER задається значення miter = 10.0f;
BasicStroke(float width) - прямий обріз CAP_SQUARE і сполучення JOIN_MITER зі значенням miter = 10.0f;
BasicStroke() - ширина 1.0f.
Краще один раз побачити, ніж сто разів прочитати. У лістингу 9.4 визначено п'ять пір'я з різними характеристиками, рис. 9.4 показує, як малюють.
Лістинг 9.4. Визначення пір'я
import java.awt.*; import java.awt.geom.*; import javax.swing.*;
class StrokeTest extends JFrame< StrokeTest(String s)
super(s); setSize(500, 400); setVisible(true);
g.setFont(new Font("Serif", Font.PLAIN, 15));
BasicStroke pen1 = новий BasicStroke(20, BasicStroke.CAP_BUTT, BasicStroke.JOIN_MITER,30);
BasicStroke pen2 = новий BasicStroke(20, BasicStroke.CAP_ROUND, BasicStroke.JOIN_ROUND);
BasicStroke pen3 = New BasicStroke(20, BasicStroke.CAP_SQUARE, BasicStroke.JOIN_BEVEL);
BasicStroke pen4 = New BasicStroke (10, BasicStroke.CAP_ROUND, BasicStroke.JOIN_BEVEL, 10, dash1, 0);

Глава 9. Графічні примітиви
BasicStroke pen5 = New BasicStroke (10, BasicStroke.CAP_BUTT, BasicStroke.JOIN_BEVEL, 10, dash2, 0);
g.draw(new Rectangle2D.Double(50, 50, 50, 50)); g.draw(new Line2D.Double(50, 180, 150, 180)); g.setStroke(pen2);
g.draw(new Rectangle2D.Double(200, 50, 50, 50)); g.draw(new Line2D.Double(50, 230, 150, 230)); g.setStroke(pen3);
g.draw(new Rectangle2D.Double(350, 50, 50, 50)); g.draw(new Line2D.Double(50, 280, 150, 280)); g.drawString("JOIN_MITER", 40, 130); g.drawString("JOIN_ROUND", 180, 130); g.drawString("JOIN_BEVEL", 330, 130); g.drawString("CAP_BUTT", 170, 190); g.drawString("CAP_ROUND", 170, 240); g.drawString("CAP_SQUARE", 170, 290); g.setStroke(pen5);
g.draw(new Line2D.Double(50, 330, 250, 330)); g.setStroke(pen4);
g.draw(new Line2D.Double(50, 360, 250, 360)); g.drawString("", 260, 335);g.drawString("", 260, 365);
Мал. 9.4. Пір'я з різними характеристиками
Частина ІІІ. Створення графічного інтерфейсу користувача та аплетів
Після створення пера одним із конструкторів та встановлення пера методом setStroke() можна малювати різні фігури методами draw() та fill() .
Загальні властивості фігур, які можна намалювати методом draw() класу Graphics2D описані в інтерфейсі Shape . Даний інтерфейс реалізований для створення звичайного набору фігур прямокутників, прямих, еліпсів, дуг, точок класами Rectangle2D,
RoundRectangle2D, Line2D, Ellipse2D, Arc2D, Point2D пакету java.awt.geom. У цьому пакеті є
ще класи CubicCurve2D та QuadCurve2D для створення кривих третього та другого порядку.
Всі ці класи абстрактні, але існують їх реалізації – вкладені класи Double та Float для завдання координат числами відповідного типу. У лістингу 9.4 використані класи Rectangle2D.Double та Line2d.Double для креслення прямокутників та відрізків.
Клас GeneralPath
У пакеті java.awt.geom є ще один цікавий клас - GeneralPath. Об'єкти цього класу можуть містити складні конструкції, складені з відрізків прямих або кривих ліній та інших фігур, з'єднаних або не з'єднаних між собою. Більше того, оскільки цей клас реалізує інтерфейс Shape, його екземпляри самі є фігурами і можуть бути елементами інших об'єктів класу GeneralPath.
Об'єкт класу GeneralPath будується так. Спочатку створюється порожній об'єкт класу GeneralPath конструктором за промовчанням GeneralPath() або об'єкт, що містить одну
фігуру, конструктором GeneralPath (Shape sh).
Потім до цього об'єкта додаються фігури методом
append(Shape sh, boolean connect);
Якщо параметрconnect дорівнює true, то нова фігура з'єднується з попередніми фігурами за допомогою поточного пера.
Об'єкт має поточну точку. Спочатку її координати (0, 0), потім її можна переміщати.
тити в точку (x, y) методом moveTo(float x, float y) .
Від поточної точки до точки (x, y) можна провести:
відрізок прямий методом lineTo(float x, float y);
відрізок квадратичної кривої методом quadTo(float x1, float y1, float x, float y);
криву Безьє методом curveTo(float x1, float y1, float x2, float y2, float x, float y) .
Поточною точкою після цього стає точка (x, y). Початкову та кінцеву точки можна з'єднати методом closePath() . Ось як можна створити трикутник із заданими вершинами:
GeneralPath p = new GeneralPath();
// Переносимо поточну точку в першу вершину,