When the user clicks the mouse, a new oval is created on the display. The user can drag around any oval.
import java.awt.*;
import objectdraw.*;
/*
* A simple drawing program that allows the user to place dots,
* drag them around and delete them by dragging them to the trash.
*/
public class DrawingProgram extends WindowController {
// Size of shape to draw
private static final int SIZE = 20;
// The variable to hold the last shape created
private FilledOval selectedShape;
// All the shapes added so far
private ShapeCollection shapes = new ShapeCollection();
// Used to support the usual dragging algorithm
private boolean dragging;
private Location lastMouse;
// Used to generate random colors
private RandomIntGenerator colorGen = new RandomIntGenerator (0, 255);
/**
* When the user clicks the mouse, draw a small filled oval.
* @param point the location where the user clicked
*/
public void onMouseClick (Location point) {
// Create a shape
selectedShape = new FilledOval(point, SIZE, SIZE, canvas);
Color shapeColor = new Color (colorGen.nextValue(), colorGen.nextValue(), colorGen.nextValue());
selectedShape.setColor (shapeColor);
shapes.addShape (selectedShape);
}
/*
* Select the object pressed on and start a drag of that object
* @param loc where the user pressed the mouse button down
*/
public void onMousePress(Location loc) {
// Select the new object and initialize the drag.
selectedShape = shapes.getShapeAt (loc);
if (selectedShape != null) {
dragging = true;
lastMouse = loc;
}
}
/*
* Drag the shape with the mouse.
* @param loc where the mouse is
*/
public void onMouseDrag(Location loc) {
if (dragging) {
// Move the shape and the selection border around the shape
selectedShape.move(loc.getX() - lastMouse.getX(), loc.getY() - lastMouse.getY());
lastMouse = loc;
}
}
/*
* Stop a drag. If the user dragged a shape to the trash, remove the shape
* @param point where the mouse is.
*/
public void onMouseRelease(Location point) {
dragging = false;
}
}
import objectdraw.*;
/**
* A collection of shapes
*
* @author Barbara Lerner
* @version December 3, 2007
*/
public class ShapeCollection
{
// The maximum number of shapes in the collection
private static final int MAX_SHAPES = 200;
// The actual shapes
private FilledOval[] shapes;
// The number of shapes currently in the collection
private int numShapes;
/**
* Create a new, empty collection
*/
public ShapeCollection () {
// Create the array to hold the shapes
shapes = new FilledOval[MAX_SHAPES];
// Remember that it is currently empty
numShapes = 0;
}
/**
* Add a shape to the collection. If the collection is already full, this method
* does nothing.
* @param newShape the shape to add
*/
public void addShape (FilledOval newShape) {
if (numShapes < shapes.length) {
shapes[numShapes] = newShape;
numShapes++;
}
}
/**
* Find the topmost shape that contains the point.
* @param point the coordinate we are looking for.
* @return the topmost shape at the point. If there is no shape there, return null.
*/
public FilledOval getShapeAt (Location point) {
// We search from the back of the array to the front because the shapes were placed
// in the order in which they were created. The topmost shape is at the end of
// the array.
for (int i = numShapes - 1; i >= 0; i--) {
if (shapes[i].contains (point)) {
return shapes[i];
}
}
// No shape there.
return null;
}
}