diff --git a/diylc/diylc-core/src/org/diylc/presenter/update.xml b/diylc/diylc-core/src/org/diylc/presenter/update.xml
index 8a2d50e4..c40f7654 100644
--- a/diylc/diylc-core/src/org/diylc/presenter/update.xml
+++ b/diylc/diylc-core/src/org/diylc/presenter/update.xml
@@ -3362,6 +3362,10 @@
NEW_FEATURE
Added 'Font Size Override' property to most components that display text to allow control over font size
+
+ IMPROVEMENT
+ Improved performance of the application when using dashed and dotted style for 'Hookup Wire' component
+
IMPROVEMENT
Technical change: replace mechanism for dynamic JAR loading to ensure compatibility with Java 11 and newer
diff --git a/diylc/diylc-library/src/org/diylc/components/connectivity/HookupWire.java b/diylc/diylc-library/src/org/diylc/components/connectivity/HookupWire.java
index ddc2d3f5..3d2c1d37 100644
--- a/diylc/diylc-library/src/org/diylc/components/connectivity/HookupWire.java
+++ b/diylc/diylc-library/src/org/diylc/components/connectivity/HookupWire.java
@@ -17,8 +17,10 @@
*/
package org.diylc.components.connectivity;
+import java.awt.AlphaComposite;
import java.awt.BasicStroke;
import java.awt.Color;
+import java.awt.Composite;
import java.awt.Graphics2D;
import java.awt.Shape;
import java.awt.Stroke;
@@ -66,31 +68,47 @@ public class HookupWire extends AbstractCurvedComponent implements IContin
: color;
g2d.setColor(curveColor);
Stroke stroke = null;
+ Stroke tracingStroke = null;
switch (getStyle()) {
case SOLID:
stroke = ObjectCache.getInstance().fetchBasicStroke(thickness);
+ tracingStroke = stroke;
break;
case DASHED:
stroke =
ObjectCache.getInstance().fetchStroke(thickness, new float[] {thickness * 2, thickness * 3}, thickness * 4, BasicStroke.CAP_SQUARE);
+ tracingStroke = ObjectCache.getInstance().fetchBasicStroke(thickness);
break;
case DOTTED:
stroke = ObjectCache.getInstance().fetchStroke(thickness, new float[] {thickness / 4, thickness * 3}, 0, BasicStroke.CAP_ROUND);
+ tracingStroke = ObjectCache.getInstance().fetchBasicStroke(thickness);
break;
}
- Shape s = stroke.createStrokedShape(curve);
- drawingObserver.startTracking();
- g2d.fill(s);
- drawingObserver.stopTracking();
+ Shape s = stroke.createStrokedShape(curve);
+
+ if (stroke == tracingStroke) {
+ g2d.fill(s);
+ drawingObserver.stopTracking();
+ } else {
+ // draw without tracking
+ drawingObserver.stopTracking();
+ g2d.fill(s);
+ // track with a simplified stroke without the dashes and dots to improve performance;
+ Shape traceShape = tracingStroke.createStrokedShape(curve);
+ drawingObserver.startTracking();
+ Composite oldComposite = g2d.getComposite();
+ g2d.setComposite(AlphaComposite.getInstance(AlphaComposite.DST, 0f));
+ g2d.fill(traceShape);
+ g2d.setComposite(oldComposite);
+ drawingObserver.stopTracking();
+ }
if (getStriped()) {
stroke = ObjectCache.getInstance().fetchStroke(thickness, new float[] { thickness / 2, thickness * 2 }, thickness * 10, BasicStroke.CAP_BUTT);
Shape stripe = stroke.createStrokedShape(curve);
g2d.setColor(getStripeColor());
g2d.fill(stripe);
- }
-
- drawingObserver.stopTracking();
+ }
if (componentState == ComponentState.NORMAL) {
g2d.setColor(color.darker());