From b0353c53a07f6d9f24eeb910b140275b329e0c62 Mon Sep 17 00:00:00 2001 From: "J. Neugebauer" Date: Thu, 28 Jul 2022 12:25:56 +0200 Subject: [PATCH] Refactorings --- .../schule/ngb/zm/layers/TurtleLayer.java | 6 +-- .../schule/ngb/zm/shapes/FilledShape.java | 11 ++++++ src/main/java/schule/ngb/zm/shapes/Shape.java | 38 +++++++------------ .../java/schule/ngb/zm/shapes/ShapeGroup.java | 31 +++++++-------- .../schule/ngb/zm/shapes/StrokedShape.java | 4 +- .../schule/ngb/zm/shapes/charts/BarChart.java | 4 +- .../ngb/zm/shapes/charts/ChartAxes.java | 2 +- .../ngb/zm/shapes/charts/LineChart.java | 2 +- .../schule/ngb/zm/shapes/charts/PieChart.java | 2 +- 9 files changed, 48 insertions(+), 52 deletions(-) diff --git a/src/main/java/schule/ngb/zm/layers/TurtleLayer.java b/src/main/java/schule/ngb/zm/layers/TurtleLayer.java index 29d61a1..1eadffe 100644 --- a/src/main/java/schule/ngb/zm/layers/TurtleLayer.java +++ b/src/main/java/schule/ngb/zm/layers/TurtleLayer.java @@ -351,7 +351,7 @@ public class TurtleLayer extends Layer { } graphics.fill(shape); graphics.setColor(Color.BLACK.getJavaColor()); - graphics.setStroke(createStroke()); + graphics.setStroke(getStroke()); graphics.draw(shape); } @@ -367,7 +367,7 @@ public class TurtleLayer extends Layer { if( penDown && strokeColor != null ) { drawing.setColor(strokeColor.getJavaColor()); - drawing.setStroke(createStroke()); + drawing.setStroke(getStroke()); drawing.drawLine((int) positionStart.x, (int) positionStart.y, (int) position.x, (int) position.y); } } @@ -420,7 +420,7 @@ public class TurtleLayer extends Layer { if( penDown && strokeColor != null ) { drawing.setColor(strokeColor.getJavaColor()); - drawing.setStroke(createStroke()); + drawing.setStroke(getStroke()); drawing.drawLine((int) x, (int) y, (int) position.x, (int) position.y); } } diff --git a/src/main/java/schule/ngb/zm/shapes/FilledShape.java b/src/main/java/schule/ngb/zm/shapes/FilledShape.java index abbc103..39c3ea9 100644 --- a/src/main/java/schule/ngb/zm/shapes/FilledShape.java +++ b/src/main/java/schule/ngb/zm/shapes/FilledShape.java @@ -179,6 +179,17 @@ public abstract class FilledShape extends StrokedShape { fill = null; } + + public Paint getPaint() { + if( fill != null ) { + return fill; + } else if( fillColor != null && fillColor.getAlpha() > 0 ) { + return fillColor; + } else { + return null; + } + } + /** * Hilfsmethode für Unterklassen, um die angegebene Form mit der aktuellen * Füllung auf den Grafik-Kontext zu zeichnen. Die Methode verändert diff --git a/src/main/java/schule/ngb/zm/shapes/Shape.java b/src/main/java/schule/ngb/zm/shapes/Shape.java index 398d957..2e5b0a2 100644 --- a/src/main/java/schule/ngb/zm/shapes/Shape.java +++ b/src/main/java/schule/ngb/zm/shapes/Shape.java @@ -14,7 +14,7 @@ import java.awt.geom.Point2D; *

* Neben den abstrakten Methoden implementieren Unterklassen mindestens zwei * Konstruktoren. Einen Konstruktor, der die Form mit vom Nutzer gegebenen - * Parametern initialisiert und einen, der die Werten einer anderen Form + * Parametern initialisiert und einen, der die Werte einer anderen Form * desselben Typs übernimmt. In der Klasse {@link Circle} sind die Konstruktoren * beispielsweise so implementiert: * @@ -191,6 +191,7 @@ public abstract class Shape extends FilledShape { /** * Dreht die Form um den angegebenen Winkel um ihren Ankerpunkt. + * * @param angle Drehwinkel in Grad. */ public void rotate( double angle ) { @@ -227,6 +228,7 @@ public abstract class Shape extends FilledShape { public double getScale() { return scale; } + public void scale( double factor ) { scale = factor; } @@ -268,28 +270,25 @@ public abstract class Shape extends FilledShape { } /** - * Bestimmt die relativen Koordinaten des angegebenen Ankerpunkt basierend + * Bestimmt die relativen Koordinaten des angegebenen Ankerpunkts basierend * auf der angegebenen Breite und Höhe des umschließenden Rechtecks. *

- * Die Koordinaten des Ankerpunkt werden relativ zur oberen linken Ecke des - * Rechtecks mit der Breite {@code width} und der Höhe {@code height} + * Die Koordinaten des Ankerpunktes werden relativ zur oberen linken Ecke + * des Rechtecks mit der Breite {@code width} und der Höhe {@code height} * bestimmt. * - * @param width Breite des umschließdenden Rechtecks. - * @param height Höhe des umschließdenden Rechtecks. + * @param width Breite des umschließenden Rechtecks. + * @param height Höhe des umschließenden Rechtecks. * @param anchor Gesuchter Ankerpunkt. * @return Ein {@link Point2D} mit den relativen Koordinaten. */ - protected static Point2D.Double getAnchorPoint( double width, double height, Options.Direction anchor ) { + public static Point2D.Double getAnchorPoint( double width, double height, Options.Direction anchor ) { double wHalf = width * .5, hHalf = height * .5; - // anchor == CENTER - Point2D.Double anchorPoint = new Point2D.Double( + return new Point2D.Double( wHalf + wHalf * anchor.x, hHalf + hHalf * anchor.y ); - - return anchorPoint; } /** @@ -303,12 +302,10 @@ public abstract class Shape extends FilledShape { double wHalf = getWidth() * .5, hHalf = getHeight() * .5; // anchor == CENTER - Point2D.Double anchorPoint = new Point2D.Double( + return new Point2D.Double( wHalf * (anchor.x - this.anchor.x), hHalf * (anchor.y - this.anchor.y) ); - - return anchorPoint; } /** @@ -384,19 +381,10 @@ public abstract class Shape extends FilledShape { * zurück. Intern werden die AWT Shapes benutzt, um sie auf den * {@link Graphics2D Grafikkontext} zu zeichnen. *

- * Da die AWT-Shape bei jedem Zeichnen (also mindestens einmal pro Frame) - * benötigt wird, wird das aktuelle Shape-Objekt in {@link #awtShape} - * zwischengespeichert. Bei Änderungen der Objekteigenschaften muss daher - * intern {@link #invalidate()} aufgerufen werden, damit beim nächsten - * Aufruf von {@link #draw(Graphics2D)} die Shape mit einem Aufurf von - * {@code getShape()} neu erzeugt wird. Unterklassen können aber auch die - * zwischengespeicherte Shape direkt modifizieren, um eine Neugenerierung zu - * vermeiden. - *

- * Wenn diese Form nicht durch eine AWT-Shape dargstellt wird, kann die + * Wenn diese Form nicht durch eine AWT-Shape dargestellt wird, kann die * Methode {@code null} zurückgeben. * - * @return Eine Java-AWT {@code Shape} die diess Form repräsentiert oder + * @return Eine Java-AWT {@code Shape} die diese Form repräsentiert oder * {@code null}. */ public abstract java.awt.Shape getShape(); diff --git a/src/main/java/schule/ngb/zm/shapes/ShapeGroup.java b/src/main/java/schule/ngb/zm/shapes/ShapeGroup.java index 88c635b..000b72d 100644 --- a/src/main/java/schule/ngb/zm/shapes/ShapeGroup.java +++ b/src/main/java/schule/ngb/zm/shapes/ShapeGroup.java @@ -7,6 +7,7 @@ import java.awt.geom.AffineTransform; import java.awt.geom.Path2D; import java.awt.geom.Point2D; import java.util.ArrayList; +import java.util.Collections; import java.util.LinkedList; import java.util.List; @@ -35,7 +36,7 @@ import java.util.List; * {@link #arrangeInGrid(int, Options.Direction, double, int)} und * {@link #align(Options.Direction)} verwendet werden, die jeweils die Position * der Formen in der Gruppe ändern und nicht die Position der Gruppe selbst (so - * wie z.B. {@link #alignTo(Shape, Options.Direction)}. + * wie z.B. {@link #alignTo(Shape, Options.Direction)}). */ public class ShapeGroup extends Shape { @@ -43,7 +44,7 @@ public class ShapeGroup extends Shape { public static final int ARRANGE_COLS = 1; - private List shapes; + private final List shapes; private double groupWidth = -1.0; @@ -51,7 +52,7 @@ public class ShapeGroup extends Shape { public ShapeGroup() { super(); - shapes = new ArrayList<>(10); + shapes = Collections.synchronizedList(new ArrayList<>(10)); } public ShapeGroup( double x, double y ) { @@ -62,9 +63,7 @@ public class ShapeGroup extends Shape { public ShapeGroup( double x, double y, Shape... shapes ) { super(x, y); this.shapes = new ArrayList<>(shapes.length); - for( Shape pShape : shapes ) { - this.shapes.add(pShape); - } + Collections.addAll(this.shapes, shapes); } public Shape copy() { @@ -99,9 +98,11 @@ public class ShapeGroup extends Shape { public List getShapes( Class typeClass ) { LinkedList list = new LinkedList<>(); - for( Shape s : shapes ) { - if( typeClass.isInstance(s) ) { - list.add((ShapeType) s); + synchronized( shapes ) { + for( Shape shape : shapes ) { + if( typeClass.isInstance(shape) ) { + list.add(typeClass.cast(shape)); + } } } return list; @@ -170,19 +171,15 @@ public class ShapeGroup extends Shape { int rows, cols; if( mode == ARRANGE_ROWS ) { rows = n; - cols = (int) ceil(shapes.size() / n); + cols = (int) ceil(shapes.size() / (double)n); } else { cols = n; - rows = (int) ceil(shapes.size() / n); + rows = (int) ceil(shapes.size() / (double)n); } // Calculate grid cell size - double maxHeight = shapes.stream().mapToDouble( - ( s ) -> s.getHeight() - ).reduce(0.0, Double::max); - double maxWidth = shapes.stream().mapToDouble( - ( s ) -> s.getWidth() - ).reduce(0.0, Double::max); + double maxHeight = shapes.stream().mapToDouble(Shape::getHeight).reduce(0.0, Double::max); + double maxWidth = shapes.stream().mapToDouble(Shape::getWidth).reduce(0.0, Double::max); double halfHeight = maxHeight * .5; double halfWidth = maxWidth * .5; diff --git a/src/main/java/schule/ngb/zm/shapes/StrokedShape.java b/src/main/java/schule/ngb/zm/shapes/StrokedShape.java index 0bdbeb5..509cb6e 100644 --- a/src/main/java/schule/ngb/zm/shapes/StrokedShape.java +++ b/src/main/java/schule/ngb/zm/shapes/StrokedShape.java @@ -197,7 +197,7 @@ public abstract class StrokedShape extends Constants implements Drawable { * * @return Ein {@code Stroke} mit den passenden Kontureigenschaften. */ - protected Stroke createStroke() { + public Stroke getStroke() { // TODO: Used global cached Stroke Objects? if( stroke == null ) { switch( strokeType ) { @@ -241,7 +241,7 @@ public abstract class StrokedShape extends Constants implements Drawable { if( strokeColor != null && strokeColor.getAlpha() > 0 && strokeWeight > 0.0 ) { graphics.setColor(strokeColor.getJavaColor()); - graphics.setStroke(createStroke()); + graphics.setStroke(getStroke()); graphics.draw(shape); } } diff --git a/src/main/java/schule/ngb/zm/shapes/charts/BarChart.java b/src/main/java/schule/ngb/zm/shapes/charts/BarChart.java index c6275c9..8690b86 100644 --- a/src/main/java/schule/ngb/zm/shapes/charts/BarChart.java +++ b/src/main/java/schule/ngb/zm/shapes/charts/BarChart.java @@ -288,7 +288,7 @@ public class BarChart extends Rectangle { barY += barHeight + gap; } graphics.setColor(getStrokeColor().getJavaColor()); - graphics.setStroke(createStroke()); + graphics.setStroke(getStroke()); if( inverted ) { graphics.drawLine((int) width, 0, (int) width, (int) height); } else { @@ -360,7 +360,7 @@ public class BarChart extends Rectangle { } graphics.setColor(getStrokeColor().getJavaColor()); - graphics.setStroke(createStroke()); + graphics.setStroke(getStroke()); if( inverted ) { graphics.drawLine(0, 0, (int) width, 0); } else { diff --git a/src/main/java/schule/ngb/zm/shapes/charts/ChartAxes.java b/src/main/java/schule/ngb/zm/shapes/charts/ChartAxes.java index 6f1c889..854ee7e 100644 --- a/src/main/java/schule/ngb/zm/shapes/charts/ChartAxes.java +++ b/src/main/java/schule/ngb/zm/shapes/charts/ChartAxes.java @@ -52,7 +52,7 @@ public class ChartAxes extends Rectangle { } graphics.setColor(strokeColor.getJavaColor()); - graphics.setStroke(createStroke()); + graphics.setStroke(getStroke()); graphics.drawLine(0, (int)(height), (int)((xMax-xMin) * xUnit), (int)(height)); graphics.drawLine(0, (int)(height), 0, (int)(height - (yMax-yMin) * yUnit)); if( showArrows ) { diff --git a/src/main/java/schule/ngb/zm/shapes/charts/LineChart.java b/src/main/java/schule/ngb/zm/shapes/charts/LineChart.java index fba1739..a15945b 100644 --- a/src/main/java/schule/ngb/zm/shapes/charts/LineChart.java +++ b/src/main/java/schule/ngb/zm/shapes/charts/LineChart.java @@ -91,7 +91,7 @@ public class LineChart extends Rectangle { for( ChartValue lcv : val ) { if( drawLines && lastLcv != null ) { graphics.setColor(getStrokeColor().getJavaColor()); - graphics.setStroke(createStroke()); + graphics.setStroke(getStroke()); graphics.drawLine((int)(lastLcv.getX()*xUnit), (int)(height - lastLcv.getValue()*yUnit), (int)(lcv.getX()*xUnit), (int)(height - lcv.getValue()*yUnit)); drawDot(graphics, lastLcv, xUnit, yUnit); } diff --git a/src/main/java/schule/ngb/zm/shapes/charts/PieChart.java b/src/main/java/schule/ngb/zm/shapes/charts/PieChart.java index 5c68b32..2a28b35 100644 --- a/src/main/java/schule/ngb/zm/shapes/charts/PieChart.java +++ b/src/main/java/schule/ngb/zm/shapes/charts/PieChart.java @@ -326,7 +326,7 @@ public class PieChart extends Circle { } graphics.setColor(getStrokeColor().getJavaColor()); - graphics.setStroke(createStroke()); + graphics.setStroke(getStroke()); graphics.drawOval(0, 0, (int) (radius * 2), (int) (radius * 2)); graphics.setTransform(originalTransform);