import javax.swing.*;
import java.awt.*;
import java.util.List;
import java.util.*;
| Canvas is a class to allow for simple graphical drawing on a canvas.
| This is a modification of the general purpose Canvas, specially made for
| the BlueJ "shapes" example.
|*
* @author: Bruce Quig
* @author: Michael Kölling (mik)
*
* @version: 1.6 (shapes)
*/
public class Canvas
{
// Note: The implementation of this class (specifically the handling of
|
|// shape identity and colors) is slightly more complex than necessary. This
|
|// is done on purpose to keep the interface and instance fields of the
|
|// shape objects in this project clean and simple for educational purposes.
|
|private static Canvas canvasSingleton;
|
|/**
| Factory method to get the canvas singleton object.
|
public static Canvas getCanvas()
{
if(canvasSingleton == null) {
canvasSingleton = new Canvas("BlueJ Shapes Demo", 300, 300,
Color.white);
}
canvasSingleton.setVisible(true);
return canvasSingleton;
}
private JFrame frame;
private CanvasPane canvas;
private Graphics2D graphic;
private Color backgroundColour;
private Image canvasImage;
private List<Object> objects;
private HashMap<Object, ShapeDescription> shapes;
| Create a Canvas.
| @param title title to appear in Canvas Frame
| @param width the desired width for the canvas
| @param height the desired height for the canvas
| @param bgClour the desired background colour of the canvas
|
private Canvas(String title, int width, int height, Color bgColour)
{
frame = new JFrame();
canvas = new CanvasPane();
frame.setContentPane(canvas);
frame.setTitle(title);
canvas.setPreferredSize(new Dimension(width, height));
backgroundColour = bgColour;
frame.pack();
objects = new ArrayList<Object>();
shapes = new HashMap<Object, ShapeDescription>();
}
| Set the canvas visibility and brings canvas to the front of screen
| when made visible. This method can also be used to bring an already
| visible canvas to the front of other windows.
| @param visible boolean value representing the desired visibility of
| the canvas (true or false)
|
public void setVisible(boolean visible)
{
if(graphic == null) {
Dimension size = canvas.getSize();
canvasImage = canvas.createImage(size.width, size.height);
graphic = (Graphics2D)canvasImage.getGraphics();
graphic.setColor(backgroundColour);
graphic.fillRect(0, 0, size.width, size.height);
graphic.setColor(Color.black);
}
frame.setVisible(visible);
}
| Draw a given shape onto the canvas.
| @param referenceObject an object to define identity for this shape
| @param color the color of the shape
| @param shape the shape object to be drawn on the canvas
|
public void draw(Object referenceObject, String color, Shape shape)
{
objects.remove(referenceObject);
objects.add(referenceObject);
shapes.put(referenceObject, new ShapeDescription(shape, color));
redraw();
}
| Erase a given shape's from the screen.
| @param referenceObject the shape object to be erased
|
public void erase(Object referenceObject)
{
objects.remove(referenceObject);
shapes.remove(referenceObject);
redraw();
}
| Set the foreground colour of the Canvas.
| @param newColour the new colour for the foreground of the Canvas
|
public void setForegroundColor(String colorString)
{
if(colorString.equals("red"))
graphic.setColor(Color.red);
else if(colorString.equals("black"))
graphic.setColor(Color.black);
else if(colorString.equals("blue"))
graphic.setColor(Color.blue);
else if(colorString.equals("yellow"))
graphic.setColor(Color.yellow);
else if(colorString.equals("green"))
graphic.setColor(Color.green);
else if(colorString.equals("magenta"))
graphic.setColor(Color.magenta);
else if(colorString.equals("white"))
graphic.setColor(Color.white);
else
graphic.setColor(Color.black);
}
| Wait for a specified number of milliseconds before finishing.
| This provides an easy way to specify a small delay which can be
| used when producing animations.
| @param milliseconds the number
|
public void wait(int milliseconds)
{
try
{
Thread.sleep(milliseconds);
}
catch (Exception e)
{
}
}
| Redraw ell shapes currently on the Canvas.
|
private void redraw()
{
erase();
for(Iterator i=objects.iterator(); i.hasNext(); ) {
((ShapeDescription)shapes.get(i.next())).draw(graphic);
}
canvas.repaint();
}
| Erase the whole canvas. (Does not repaint.)
|
private void erase()
{
Color original = graphic.getColor();
graphic.setColor(backgroundColour);
Dimension size = canvas.getSize();
graphic.fill(new Rectangle(0, 0, size.width, size.height));
graphic.setColor(original);
}
/************************************************************************
| Inner class CanvasPane - the actual canvas component contained in the
| Canvas frame. This is essentially a JPanel with added capability to
| refresh the image drawn on it.
|
private class CanvasPane
extends JPanel
{
public void paint(Graphics g)
{
g.drawImage(canvasImage, 0, 0, null);
}
}
/************************************************************************
| Inner class CanvasPane - the actual canvas component contained in the
| Canvas frame. This is essentially a JPanel with added capability to
| refresh the image drawn on it.
|
private class ShapeDescription
{
private Shape shape;
private String colorString;
public ShapeDescription(Shape shape, String color)
{
this.shape = shape;
colorString = color;
}
public void draw(Graphics2D graphic)
{
setForegroundColor(colorString);
graphic.fill(shape);
}
}
}
. getCanvas
. Canvas
. setVisible
. draw
. erase
. setForegroundColor
. wait
. redraw
. erase
top,
use,
map,
class CanvasPane
. paint
top,
use,
map,
class CanvasPane . ShapeDescription
. ShapeDescription
. draw
145 neLoCode
+ 41 LoComm