GraphicsApp API
Eine überarbeitete und angepasste Variante der originalen GraphicsApp-Umgebung
Canvas.java
gehe zur Dokumentation dieser Datei
1package de.ur.mi.oop.app;
2
3import de.ur.mi.oop.fonts.FontPool;
4import de.ur.mi.oop.graphics.*;
5import de.ur.mi.oop.graphics.Label;
6import de.ur.mi.oop.graphics.Point;
7
8import javax.swing.*;
9import java.awt.*;
10import java.awt.Rectangle;
11import java.awt.geom.AffineTransform;
12import java.awt.geom.Arc2D;
13import java.awt.geom.Ellipse2D;
14import java.awt.geom.Rectangle2D;
15
16/**
17 * Zeichenfläche zur Darstellung der einzelnen GraphicsObjects
18 */
19public class Canvas extends JPanel {
20
21 private GraphicsObject[] components;
22 private RenderingHints renderingHints;
23
24 public Canvas() {
25 this.setOpaque(false);
26 createRenderingHints();
27 }
28
29 private void createRenderingHints() {
30 renderingHints = new RenderingHints(RenderingHints.KEY_ANTIALIASING,
31 RenderingHints.VALUE_ANTIALIAS_ON);
32 renderingHints.put(RenderingHints.KEY_RENDERING, RenderingHints.VALUE_RENDER_SPEED);
33
34 }
35
36 public void setComponents(GraphicsObject[] components) {
37 this.components = components;
38 }
39
40 @Override
41 protected void paintComponent(Graphics g) {
42 super.paintComponent(g);
43 Graphics2D g2d = (Graphics2D) g;
44 g2d.setRenderingHints(renderingHints);
45 draw(g2d);
46 }
47
48 private void draw(Graphics2D g2d) {
49 if (components != null) {
50 for (GraphicsObject component : components) {
51 drawComponent(g2d, component);
52 }
53 }
54 }
55
56 private void drawComponent(Graphics2D g2d, GraphicsObject object) {
57 switch (object.getType()) {
58 case ARC:
59 drawArc(g2d, (Arc) object);
60 break;
61 case CIRCLE:
62 drawCircle(g2d, (Circle) object);
63 break;
64 case ELLIPSE:
65 drawEllipse(g2d, (Ellipse) object);
66 break;
67 case IMAGE:
68 drawImage(g2d, (de.ur.mi.oop.graphics.Image) object);
69 break;
70 case LABEL:
71 drawLabel(g2d, (de.ur.mi.oop.graphics.Label) object);
72 break;
73 case LINE:
74 drawLine(g2d, (Line) object);
75 break;
76 case PIE_ARC:
77 drawPieArc(g2d, (Arc) object);
78 break;
79 case BACKGROUND:
80 case RECTANGLE:
81 drawRectangle(g2d, (de.ur.mi.oop.graphics.Rectangle) object);
82 break;
83 default:
84 break;
85 }
86 }
87
88 private void drawArc(Graphics2D g2d, Arc arc) {
89 Arc2D arcShape = new Arc2D.Float(
90 arc.getXPos() - arc.getRadius(),
91 arc.getYPos() - arc.getRadius(),
92 arc.getRadius() * 2, arc.getRadius() * 2,
93 arc.getStart(),
94 arc.getEnd(),
95 Arc2D.OPEN);
96 drawShape(g2d, arc, arcShape);
97 }
98
99 private void drawCircle(Graphics2D g2d, Circle circle) {
100 Ellipse2D circleShape = new Ellipse2D.Float(
101 circle.getXPos() - circle.getRadius(),
102 circle.getYPos() - circle.getRadius(),
103 circle.getRadius() * 2,
104 circle.getRadius() * 2);
105
106 drawShape(g2d, circle, circleShape);
107 }
108
109 private void drawEllipse(Graphics2D g2d, Ellipse ellipse) {
110 Ellipse2D ellipseShape = new Ellipse2D.Float(
111 ellipse.getXPos() - ellipse.getRadiusX(),
112 ellipse.getYPos() - ellipse.getRadiusY(),
113 ellipse.getRadiusX() * 2,
114 ellipse.getRadiusY() * 2);
115
116 drawShape(g2d, ellipse, ellipseShape);
117 }
118
119 private void drawImage(Graphics2D g2d, de.ur.mi.oop.graphics.Image image) {
120 AffineTransform rotatedTransform = getRotationTransformForObject(image);
121 rotatedTransform.translate(image.getXPos(), image.getYPos());
122 rotatedTransform.scale(1, 1);
123 g2d.drawImage(image.getImage(), rotatedTransform, null);
124 }
125
126 private void drawLabel(Graphics2D g2d, Label label) {
127 AffineTransform originalTransform = g2d.getTransform();
128 /*
129 * To prevent positioning errors, instead of rotating the current g2d context,
130 * we only rotate the label's font.
131 */
132 Font originalFont = FontPool.getFont(label.getFont(), Font.PLAIN, label.getFontSize());
133 g2d.setFont(originalFont.deriveFont(getRotationTransformForObject(label)));
134 g2d.setColor(label.getColor().asAWTColor());
135 g2d.translate(label.getXPos(), label.getYPos());
136 g2d.scale(originalTransform.getScaleX(), originalTransform.getScaleY());
137 g2d.drawString(label.getText(), 0, 0);
138 g2d.setTransform(originalTransform);
139 }
140
141 private void drawLine(Graphics2D g2d, Line line) {
142 g2d.setColor(line.getColor().asAWTColor());
143 Stroke stroke = new BasicStroke(line.getLineWidth());
144 g2d.setStroke(stroke);
145 g2d.drawLine(
146 (int) line.getXPos(),
147 (int) line.getYPos(),
148 (int) line.getEndpointX(),
149 (int) line.getEndpointY());
150 }
151
152 private void drawPieArc(Graphics2D g2d, Arc arc) {
153 Arc2D arcShape = new Arc2D.Float(
154 arc.getXPos() - arc.getRadius(),
155 arc.getYPos() - arc.getRadius(),
156 arc.getRadius() * 2, arc.getRadius() * 2,
157 arc.getStart(),
158 arc.getEnd(),
159 Arc2D.PIE);
160 drawShape(g2d, arc, arcShape);
161 }
162
163 private void drawRectangle(Graphics2D g2d, de.ur.mi.oop.graphics.Rectangle rect) {
164 Rectangle2D rectShape = new Rectangle.Float(
165 rect.getXPos(),
166 rect.getYPos(),
167 rect.getWidth(),
168 rect.getHeight());
169
170 drawShape(g2d, rect, rectShape);
171 }
172
173 private void drawShape(Graphics2D g2d, GraphicsObject graphicsObject, Shape shape) {
174 g2d.setPaint(graphicsObject.getColor().asAWTColor());
175 g2d.fill(shape);
176 if (graphicsObject.getBorderWeight() != 0.f) {
177 Stroke stroke = new BasicStroke(graphicsObject.getBorderWeight());
178 Color strokeColor = graphicsObject.getBorderColor().asAWTColor();
179 g2d.setStroke(stroke);
180 g2d.setPaint(strokeColor);
181 g2d.draw(shape);
182 }
183 }
184
185 /**
186 * Return an AffineTransform instance to draw a rotated version of an given GraphicsObject.
187 *
188 * @param object The object to be rotated
189 * @return The AffineTransform to be applied before or during drawing
190 */
191 private AffineTransform getRotationTransformForObject(RotatableGraphicsObject object) {
192 double rotationAngleInRadians = object.getRotationAngleInRadians();
193 Point rotationOrigin = object.getRotationOrigin();
194 return AffineTransform.getRotateInstance(rotationAngleInRadians, rotationOrigin.getXPos(), rotationOrigin.getYPos());
195 }
196
197}
void setComponents(GraphicsObject[] components)
Definition: Canvas.java:36
void paintComponent(Graphics g)
Definition: Canvas.java:41
java.awt.Color asAWTColor()
Definition: Color.java:111