Skip to content

Commit 9ca4f48

Browse files
committed
Introduced LazyCanvas
1 parent 86b6c06 commit 9ca4f48

6 files changed

Lines changed: 158 additions & 112 deletions

File tree

src/main/java/org/teachingextensions/WindowUtils/MultiTurtleWindow.java

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -4,6 +4,7 @@
44
import org.teachingextensions.logo.utils.ColorUtils.PenColors;
55
import org.teachingextensions.logo.utils.InterfaceUtils.MultiTurtlePainter;
66
import org.teachingextensions.logo.utils.InterfaceUtils.MultiTurtleTrailPainter;
7+
import org.teachingextensions.logo.utils.InterfaceUtils.TurtleFrame;
78
import org.teachingextensions.logo.utils.LineAndShapeUtils.Paintable;
89

910
import java.util.ArrayList;
@@ -40,6 +41,11 @@ public void addTurtle(Turtle turtle) {
4041
configurePainters();
4142
}
4243

44+
@Override
45+
public TurtleWindow init(Turtle turtle, TurtleFrame frame) {
46+
return this;
47+
}
48+
4349
@Override
4450
protected Paintable createTurtleTrailPainter() {
4551
this.setTrailPainter(new MultiTurtleTrailPainter(this.turtles));

src/main/java/org/teachingextensions/WindowUtils/ProgramWindow.java

Lines changed: 63 additions & 21 deletions
Original file line numberDiff line numberDiff line change
@@ -16,25 +16,26 @@
1616

1717
import javax.swing.*;
1818
import java.awt.*;
19+
import java.awt.event.MouseListener;
1920
import java.awt.image.BufferedImage;
2021

2122
/**
2223
* <img src="http://ftpmirror.your.org/pub/wikimedia/images/wikibooks/de/2/2c/JPanel_Add_JButton_PAGE_END.JPG" style="text-align: left" alt="A window image" height="50" width="75" > Program Window
2324
* allows you to change the color of the background and more...
2425
*/
2526
public class ProgramWindow {
26-
private final CanvasPanel panel = new CanvasPanel();
27+
private final LazyCanvas canvas = new LazyCanvas();
2728
private JFrame frame;
2829

2930
public ProgramWindow(String title) {
3031
this();
3132
this.frame = new JFrame(title);
32-
this.frame.getContentPane().add(this.panel);
33+
this.canvas.addTo(this.frame);
3334
ProgramWindow.createStandardFrame(getFrame());
3435
}
3536

3637
public ProgramWindow() {
37-
this.panel.setPreferredSize(new Dimension(627, 442));
38+
this.canvas.setPreferredSize(new Dimension(627, 442));
3839
setColor(PenColors.Whites.White);
3940
}
4041

@@ -51,17 +52,16 @@ public static void createStandardFrame(JFrame frame) {
5152
* A button instance
5253
*/
5354
public void addButton(JButton button) {
54-
this.panel.add(button);
55+
this.canvas.add(button);
5556
}
5657

5758

5859
public void setColor(Color backgroundColor) {
59-
this.panel.setBackground(backgroundColor);
60+
this.canvas.setBackground(backgroundColor);
6061
}
6162

62-
@Deprecated
6363
public ProgramWindow clearWindow() {
64-
this.panel.clear();
64+
this.canvas.clear();
6565
return this;
6666
}
6767

@@ -73,7 +73,7 @@ public ProgramWindow clearWindow() {
7373
* A listener instance
7474
*/
7575
public void addMouseRightClickListener(MouseRightClickListener listener) {
76-
this.panel.addMouseListener(new RightClickMouseAdapter(listener));
76+
this.canvas.addMouseListener(new RightClickMouseAdapter(listener));
7777
}
7878

7979
/**
@@ -84,7 +84,7 @@ public void addMouseRightClickListener(MouseRightClickListener listener) {
8484
* A listener instance
8585
*/
8686
public void addMouseLeftClickListener(MouseLeftClickListener listener) {
87-
this.panel.addMouseListener(new LeftClickMouseAdapter(listener));
87+
this.canvas.addMouseListener(new LeftClickMouseAdapter(listener));
8888
}
8989

9090
/**
@@ -104,38 +104,38 @@ public JFrame getFrame() {
104104

105105
public void setWindowVisible(boolean b) {
106106
this.frame.setVisible(b);
107-
this.panel.setVisible(b);
107+
this.canvas.getValue().setVisible(b);
108108
}
109109

110110
@Deprecated
111111
public ProgramWindow add(Paintable painter) {
112-
this.panel.add(painter);
112+
this.canvas.getValue().add(painter);
113113
return this;
114114
}
115115

116116
@Deprecated
117117
public ProgramWindow remove(Paintable painter) {
118-
this.panel.remove(painter);
118+
this.canvas.getValue().remove(painter);
119119
return this;
120120
}
121121

122122

123123
public final BufferedImage getWindowImage() {
124-
return ComponentApprovalWriter.drawComponent(this.panel);
124+
return ComponentApprovalWriter.drawComponent(this.canvas.getValue());
125125
}
126126

127127
public ProgramWindow addTo(TurtleFrame frame) {
128-
frame.addContent(this.panel);
128+
frame.addContent(this.canvas.getValue());
129129
return this;
130130
}
131131

132132
public ProgramWindow repaint() {
133-
this.panel.repaint();
133+
this.canvas.getValue().repaint();
134134
return this;
135135
}
136136

137137
public ProgramWindow setVisible(boolean visible) {
138-
this.panel.setVisible(visible);
138+
this.canvas.getValue().setVisible(visible);
139139
return this;
140140
}
141141

@@ -145,17 +145,59 @@ public ProgramWindow setCursor(int cursor) {
145145
}
146146

147147
public ProgramWindow setCursor(Cursor predefinedCursor) {
148-
this.panel.setCursor(predefinedCursor);
148+
this.canvas.getValue().setCursor(predefinedCursor);
149+
return this;
150+
}
151+
152+
public ProgramWindow setBackground(Color color) {
153+
this.canvas.setBackground(color);
149154
return this;
150155
}
151156

152157
public CanvasPanel getCanvas() {
153-
return this.panel;
158+
return this.canvas.getValue();
154159
}
155160

156-
public ProgramWindow setBackground(Color color) {
157-
this.panel.setBackground(color);
158-
return this;
161+
private class LazyCanvas {
162+
private CanvasPanel panel;
163+
164+
public LazyCanvas addTo(JFrame frame) {
165+
frame.getContentPane().add(this.getValue());
166+
return this;
167+
}
168+
169+
public CanvasPanel getValue() {
170+
if (this.panel == null){
171+
this.panel = new CanvasPanel();
172+
}
173+
174+
return panel;
175+
}
176+
177+
public LazyCanvas setPreferredSize(Dimension dimension) {
178+
this.getValue().setPreferredSize(dimension);
179+
return this;
180+
}
181+
182+
public LazyCanvas add(JButton button) {
183+
this.getValue().add(button);
184+
return this;
185+
}
186+
187+
public LazyCanvas setBackground(Color color) {
188+
this.getValue().setBackground(color);
189+
return this;
190+
}
191+
192+
public LazyCanvas clear() {
193+
this.getValue().clear();
194+
return this;
195+
}
196+
197+
public LazyCanvas addMouseListener(MouseListener adapter) {
198+
this.getValue().addMouseListener(adapter);
199+
return this;
200+
}
159201
}
160202
}
161203

src/main/java/org/teachingextensions/WindowUtils/TurtleWindow.java

Lines changed: 16 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -3,6 +3,7 @@
33
import org.teachingextensions.approvals.lite.util.ObjectUtils;
44
import org.teachingextensions.logo.Turtle;
55
import org.teachingextensions.logo.Turtle.Animals;
6+
import org.teachingextensions.logo.utils.InterfaceUtils.TurtleFrame;
67
import org.teachingextensions.logo.utils.InterfaceUtils.TurtlePainter;
78
import org.teachingextensions.logo.utils.InterfaceUtils.TurtleTrailPainter;
89
import org.teachingextensions.logo.utils.LineAndShapeUtils.Paintable;
@@ -74,7 +75,7 @@ protected Paintable createTurtlePainter() {
7475
}
7576

7677
protected Image loadAnimal() {
77-
return ObjectUtils.loadImage(MultiTurtleWindow.class, this.animal + ".png");
78+
return ObjectUtils.loadImage(TurtleWindow.class, this.animal + ".png");
7879
}
7980

8081
protected Paintable getTrailPainter() {
@@ -92,5 +93,19 @@ protected Paintable getTurtlePainter() {
9293
protected void setTurtlePainter(Paintable turtlePainter) {
9394
this.turtlePainter = turtlePainter;
9495
}
96+
97+
public TurtleWindow init(Turtle turtle, TurtleFrame frame) {
98+
if (this.turtle != null){
99+
return this;
100+
}
101+
102+
if (turtle.getSpeed() != Turtle.TEST_SPEED) {
103+
this.addTo(frame);
104+
frame.setStandardLayout();
105+
}
106+
107+
this.setTurtle(turtle);
108+
return this;
109+
}
95110
}
96111

Lines changed: 45 additions & 43 deletions
Original file line numberDiff line numberDiff line change
@@ -1,50 +1,52 @@
11
package org.teachingextensions.approvals.lite.writers;
22

3-
import java.awt.Component;
4-
import java.awt.Graphics;
5-
import java.awt.image.BufferedImage;
6-
7-
import javax.swing.JFrame;
8-
93
import org.teachingextensions.approvals.lite.ApprovalWriter;
104

11-
public class ComponentApprovalWriter implements ApprovalWriter {
12-
private ImageApprovalWriter image = null;
13-
14-
public ComponentApprovalWriter(Component c) {
15-
BufferedImage image = drawComponent(c);
16-
this.image = new ImageApprovalWriter(image);
17-
}
18-
19-
public static BufferedImage drawComponent(Component c) {
20-
validateComponent(c);
21-
BufferedImage image = new BufferedImage(c.getWidth(), c.getHeight(), BufferedImage.TYPE_INT_ARGB);
22-
Graphics g = image.createGraphics();
23-
c.paint(g);
24-
g.dispose();
25-
return image;
26-
}
27-
28-
private static void validateComponent(Component c) {
29-
if (!c.isValid()) {
30-
JFrame frame = new JFrame();
31-
frame.getContentPane().add(c);
32-
frame.pack();
33-
}
34-
}
35-
36-
@Override
37-
public String getApprovalFilename(String base) {
38-
return image.getApprovalFilename(base);
39-
}
40-
41-
@Override
42-
public String getReceivedFilename(String base) {
43-
return image.getReceivedFilename(base);
44-
}
5+
import javax.swing.*;
6+
import java.awt.*;
7+
import java.awt.image.BufferedImage;
458

46-
@Override
47-
public String writeReceivedFile(String filename) throws Exception {
48-
return image.writeReceivedFile(filename);
9+
public class ComponentApprovalWriter implements ApprovalWriter {
10+
private ImageApprovalWriter image = null;
11+
12+
public ComponentApprovalWriter(Component c) {
13+
BufferedImage image = drawComponent(c);
14+
this.image = new ImageApprovalWriter(image);
15+
}
16+
17+
public static BufferedImage drawComponent(Component c) {
18+
validateComponent(c);
19+
BufferedImage image = new BufferedImage(c.getWidth(), c.getHeight(), BufferedImage.TYPE_INT_ARGB);
20+
Graphics g = image.createGraphics();
21+
c.paint(g);
22+
g.dispose();
23+
return image;
24+
}
25+
26+
private static void validateComponent(Component c) {
27+
if (!c.isValid()) {
28+
if (c instanceof JFrame) {
29+
((JFrame) c).pack();
30+
} else {
31+
JFrame frame = new JFrame();
32+
frame.getContentPane().add(c);
33+
frame.pack();
34+
}
4935
}
36+
}
37+
38+
@Override
39+
public String writeReceivedFile(String filename) throws Exception {
40+
return image.writeReceivedFile(filename);
41+
}
42+
43+
@Override
44+
public String getReceivedFilename(String base) {
45+
return image.getReceivedFilename(base);
46+
}
47+
48+
@Override
49+
public String getApprovalFilename(String base) {
50+
return image.getApprovalFilename(base);
51+
}
5052
}

0 commit comments

Comments
 (0)