Рисование фигур средствами Java2D. Класс BasicStroke.
Характеристики пера для рисования фигур описаны в интерфейсе stroke. В Java 2D есть пока только один класс, реализующий этот интерфейс – класс 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, начиная с которого применяется сопряжение JOIN_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 j ava.awt.*; import j ava.awt.geom. *; import j ava.awt.event.*; class StrokeTest extends Frame{ StrokeTest(String s) { super (s); setSize(500, 400); setvisible(true); addWindowListener(new WindowAdapter(){ public void windowClosing(WindowEvent ev)( System.exit(0); } }); } public void paint(Graphics gr){ Graphics2D g = (Graphics2D)gr; g.setFont(new Font("Serif", Font.PLAIN, 15)); BasicStroke penl = new BasicStroke(20, BasicStroke.CAP_BUTT, BasicStroke.JOIN_MITER,30); BasicStroke pen2 = new BasicStroke(20, BasicStroke.CAP_ROUND, BasicStroke.JOIN_ROUND); BasicStroke репЗ = new BasicStroke(20, BasicStroke.CAP_SQUARE, BasicStroke.JOIN_BEVEL); floatf] dashl = {5, 20}; BasicStroke pen4 = new BasicStroke(10, BasicStroke.CAP_ROUND, BasicStroke.JOIN_BEVEL, 10, dashl, 0); float[] dash2 = (10, 5, 5, 5}; BasicStroke pen5 = new BasicStroke(10, BasicStroke.CAP_BUTT, BasicStroke.JOIN_BEVEL, 10, dash2, 0); g.setStroke(penl); 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(реnЗ); 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("JOINJBEVEL", 330, 130); g.drawstring("CAP_BUTT", 170, 190); g.drawstring("CAP_ROUND", 170, 240); g.drawstring("CAP_SQUARE", 170, 290); g.setStroke(pen5); g.drawfnew Line2D.Double(50, 330, 250, 330)); g.setStroke(pen4); g.draw(new Line2D.Double(50, 360, 250, 360)); g.drawString("{10, 5, 5, 5,…}", 260, 335); g.drawstring(<strong>(5</strong>, 10,…}", 260, 365); } public static void main(String[] args){ new StrokeTest("Моя программа"); } }