Computer Science 120
Introduction to Programming

Spring 2011, Siena College

DragStudents Demo

A working demo of DragStudents will appear below. Click inside the applet to interact with it.



DragStudents BlueJ Project

Click here to download a BlueJ project for DragStudents.


DragStudents Source Code

The Java source code for DragStudents is below. Click on a file name to download it.


DragStudents.java

import objectdraw.*;
import java.awt.*;

/*
 * Example DragStudents: randomly scatter draggable student pictures on the canvas
 *
 * Jim Teresco, Siena College, CSIS 120, Spring 2011
 *
 * $Id: DragStudents.java 1579 2011-03-29 02:44:33Z terescoj $
 */

public class DragStudents extends WindowController {

    // all images will be resized to this
    private static final int IMAGE_SIZE = 50;
    // the array of image file names
    private String[] imageFiles = {
        "amy-head.jpg",
        "billh-head.jpg",
        "bryan-head.jpg",
        "cameron-head.jpg",
        "chelsea-head.jpg",
        "christina-head.jpg",
        "dana-head.jpg",
        "david-head.jpg",
        "devinh-head.jpg",
        "ed-head.jpg",
        "frank-head.jpg",
        "grady-head.jpg",
        "john-head.jpg",
        "jonbias-head.jpg",
        "jonbutler-head.jpg",
        "justin-head.jpg",
        "karl-head.jpg",
        "katie-head.jpg",
        "leah-head.jpg",
        "luke-head.jpg",
        "matt-head.jpg",
        "meghan-head.jpg",
        "pat-head.jpg",
        "samantha-head.jpg",
        "shannon-head.jpg",
        "zack-head.jpg"
    };
    
    // array of VisibleImage objects for display and dragging
    private VisibleImage[] heads;
    
    // support for dragging
    private boolean dragging;
    private VisibleImage selectedHead;
    private Location lastPoint;
    
    // how much to scale up images when dragging
    private static final int DRAG_ZOOM = 4;
    
    /**
     * draw the initial random scattering of student pictures
     * on the canvas, taking care not to overlap initially.
     */
    public void begin() {
        
        // generators for legal positions with the images completely on the canvas
        RandomIntGenerator xPosGen = new RandomIntGenerator(0, canvas.getWidth() - IMAGE_SIZE);
        RandomIntGenerator yPosGen = new RandomIntGenerator(0, canvas.getHeight() - IMAGE_SIZE);
    
        heads = new VisibleImage[imageFiles.length];
        
        // place the images
        for (int imageNum = 0; imageNum < heads.length; imageNum++) {
            heads[imageNum] = new VisibleImage(getImage(imageFiles[imageNum]),
                                               xPosGen.nextValue(),
                                               yPosGen.nextValue(),
                                               canvas);
            heads[imageNum].setWidth(IMAGE_SIZE);
            heads[imageNum].setHeight(IMAGE_SIZE);
            
            // move this image around until we find a position where it
            // does not overlap with any already-placed image
            while (overlapsAny(imageNum)) {
                heads[imageNum].moveTo(xPosGen.nextValue(), yPosGen.nextValue());
            }
        }
        
        // setup for dragging
        dragging = false;
        selectedHead = heads[0];
    }
    
    /**
     * a private helper method to determine whether the VisibleImage
     * at heads[index] overlaps with any of the VisibleImages at 
     * heads[0] up through heads[index-1].
     * 
     * @param index the index of the VisibleImage to check for overlap
     * @return a boolean indicating whether heads[index] overlaps any of
     *  heads[0] through heads[index-1]
     */
    private boolean overlapsAny(int index) {
        
        // check each possible overlap
        for (int compareTo = 0; compareTo < index; compareTo++) {
            if (heads[index].overlaps(heads[compareTo])) {
                return true;
            }
        }
        
        // we didn't find any overlap, so we return false
        return false;
    }
    
    /**
     * start dragging if the Location is on one of the student images
     * 
     * @param point the Location of the mouse when pressed
     */
    public void onMousePress(Location point) {
        lastPoint = point;

        dragging = false;
        // test the selected student (which is on top) first.
        if (selectedHead.contains(point)) {
            dragging = true;
        } else {
            for (int imageNum = 0; imageNum