Computer Science 252
Problem Solving with Java
Spring 2014, The College of Saint Rose
Drag2Shirts Demo
A working demo of Drag2Shirts will appear below. Click inside the applet to interact with it.
Drag2Shirts BlueJ Project
Click here to download a BlueJ project for Drag2Shirts.
Drag2Shirts Source Code
The Java source code for Drag2Shirts is below. Click on a file name to download it.
import objectdraw.*; import java.awt.*; /* * Example Drag2Shirts * * Drag a shirt around window, given choice * of red shirt or blue shirt. * * Jim Teresco, Siena College, CSIS 120, Spring 2011 * The College of Saint Rose, Fall 2013 * Based on example from Williams College CSCI 134 * * $Id: Drag2Shirts.java 2218 2013-10-18 14:06:39Z terescoj $ */ public class Drag2Shirts extends WindowController { // starting location of t-shirt private static final int ITEM_LEFT = 75; private static final int ITEM_TOP = 50; private static final int SND_OFFSET = 150; // T-shirts on the screen private TShirt redShirt, blueShirt; // The piece of laundry to be moved. private TShirt selectedShirt; // Previously noted position of mouse cursor private Location lastPoint; // Whether user is actually dragging a shirt private boolean dragging; // display the shirts public void begin() { redShirt = new TShirt(ITEM_LEFT, ITEM_TOP, canvas); redShirt.setColor(Color.red); blueShirt = new TShirt(ITEM_LEFT + SND_OFFSET, ITEM_TOP, canvas); blueShirt.setColor(Color.blue); selectedShirt = blueShirt; // blue shirt on top at start } // Whenever mouse is depressed, note its location // and which (if any) shirt the mouse is on. public void onMousePress(Location point) { lastPoint = point; // test the selected shirt (which is on top) first. if (selectedShirt.contains(point)) { dragging = true; } else if (blueShirt.contains(point)) { selectedShirt = blueShirt; dragging = true; selectedShirt.sendToFront(); } else if (redShirt.contains(point)) { selectedShirt = redShirt; dragging = true; selectedShirt.sendToFront(); } else { dragging = false; } } // If mouse is dragged, move the selected shirt with it // If didn't press mouse on a shirt, do nothing public void onMouseDrag(Location point) { if (dragging) { selectedShirt.move(point.getX() - lastPoint.getX(), point.getY() - lastPoint.getY()); lastPoint = point; } } // move both shirts back to starting positions when mouse leaves window public void onMouseExit(Location point) { redShirt.reset(); blueShirt.reset(); dragging = false; } }
import objectdraw.*; import java.awt.*; /* * Example Drag2Shirts * * A class that defines a graphical type that looks a bit * like a t-shirt. * * Jim Teresco, Siena College, CSIS 120, Spring 2011 * The College of Saint Rose, Fall 2013 * Based on example from Williams College CSCI 134 * * $Id: TShirt.java 2218 2013-10-18 14:06:39Z terescoj $ */ public class TShirt { // constant dimensions private static final int WIDTH = 150; private static final int HEIGHT = 175; private static final int BODY_WIDTH = 100; private static final int NECK_HEIGHT = 20; private static final int SLEEVE_OFFSET = NECK_HEIGHT/2; private static final int NECK_WIDTH = 75; private static final int SLEEVE_HEIGHT = 40; private static final int BODY_HEIGHT = HEIGHT - SLEEVE_HEIGHT; private static final int SLEEVE_LENGTH = (WIDTH-BODY_WIDTH)/2; // instance variables for shirt components private FilledRect body; private FramedRect bodyFrame; private FilledRect sleeves; private FramedRect sleeveFrame; private FilledOval neck; private FramedOval neckFrame; // remember the initial position of the tshirt private double startX, startY; /* * Create a new T-shirt with its upper left corner at (x,y) and with * a width of size. */ public TShirt(double x, double y, DrawingCanvas canvas) { bodyFrame = new FramedRect(x+SLEEVE_LENGTH, y+SLEEVE_HEIGHT, BODY_WIDTH, BODY_HEIGHT, canvas); sleeves = new FilledRect(x, y+SLEEVE_OFFSET, WIDTH, SLEEVE_HEIGHT, canvas); sleeves.setColor(Color.white); sleeveFrame = new FramedRect(x, y+SLEEVE_OFFSET, WIDTH, SLEEVE_HEIGHT, canvas); body = new FilledRect(x+SLEEVE_LENGTH+1, y+SLEEVE_HEIGHT, BODY_WIDTH-2, BODY_HEIGHT-1, canvas); body.setColor(Color.white); neck = new FilledOval(x + (WIDTH-NECK_WIDTH)/2, y, NECK_WIDTH, NECK_HEIGHT, canvas); neck.setColor(Color.white); neckFrame = new FramedOval(x + (WIDTH-NECK_WIDTH)/2, y, NECK_WIDTH, NECK_HEIGHT, canvas); // remember initial location startX = x; startY = y; } /* * Move the t-shirt by specified offsets. */ public void move(double xOffset, double yOffset) { bodyFrame.move(xOffset,yOffset); sleeves.move(xOffset,yOffset); sleeveFrame.move(xOffset,yOffset); body.move(xOffset,yOffset); neck.move(xOffset,yOffset); neckFrame.move(xOffset,yOffset); } /* * Returns true if the t-shirt contains the point; * false otherwise */ public boolean contains(Location pt) { return bodyFrame.contains(pt) || sleeveFrame.contains(pt) || neckFrame.contains(pt); } /* * Change color of t-shirt to newColor. */ public void setColor(Color newColor) { body.setColor(newColor); sleeves.setColor(newColor); neck.setColor(newColor); } /* * Put t-shirt in front of other objects on canvas. * * Note that this must be done in a particular order to ensure * that the t-shirt appears as intended (appropriate parts * obscured behind others). We use the same order in which * we originally constructed the t-shirt. */ public void sendToFront() { bodyFrame.sendToFront(); sleeves.sendToFront(); sleeveFrame.sendToFront(); body.sendToFront(); neck.sendToFront(); neckFrame.sendToFront(); } /* * Move the t-shirt to a new upper-left coordinate position. */ public void moveTo(double x, double y) { double dx, dy; dx = x - sleeves.getX(); dy = y - neck.getY(); this.move(dx, dy); } /* * Move t-shirt back to starting position. */ public void reset() { this.moveTo(startX, startY); } }