FileDocCategorySizeDatePackage
MouseDragClip.javaAPI DocExample4371Sun Feb 08 21:33:50 GMT 2004None

MouseDragClip

public class MouseDragClip extends Canvas implements MouseListener, MouseMotionListener
MouseDragClip -- implement simple mouse drag in a window. Speed up by using clipping regions.

This version "works" for very simple cases (only drag down and to the right, never move up or back :-) ).

author
Ian Darwin, http://www.darwinsys.com/

(Omit source code)

Fields Summary
Image
curImage
The Image we are to paint
static Label
status
Kludge for showStatus
boolean
inDrag
true if we are in drag
int
startX
starting location of a drag
int
startY
int
curX
current location of a drag
int
curY
int
oldX
Previous ending of current drag
int
oldY
int
oldStartX
Start of previous selection, if completed, else -1
int
oldStartY
int
oldWidth
Size of previous selection, if completed, else -1
int
oldHeight
Constructors Summary
public MouseDragClip(Image i)
Construct the MouseDragClip object, given an Image

		super();
		curImage = i;
		setSize(300,200);
		addMouseListener(this);
		addMouseMotionListener(this);
	
Methods Summary
public static voidmain(java.lang.String[] av)


	// "main" method
	     
		JFrame f = new JFrame("Mouse Dragger");
		Container cp = f.getContentPane();

		if (av.length < 1) {
			System.err.println("Usage: MouseDragClip imagefile");
			System.exit(1);
		}
		Image im = Toolkit.getDefaultToolkit().getImage(av[0]);

		// create a MouseDragClip object
		MouseDragClip j = new MouseDragClip(im);

		cp.setLayout(new BorderLayout());
		cp.add(BorderLayout.NORTH,
			new Label("Hello, and welcome to the world of Java"));
		cp.add(BorderLayout.CENTER, j);
		cp.add(BorderLayout.SOUTH, status = new Label());
		status.setSize(f.getSize().width, status.getSize().height);
		f.pack();
		f.setVisible(true);
		f.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
	
public voidmouseClicked(java.awt.event.MouseEvent e)
Called when the mouse has been clicked on a component.

	
public voidmouseDragged(java.awt.event.MouseEvent e)

		Point p = e.getPoint();
		// showStatus("mouse dragged to " + p);
		curX = p.x; curY = p.y;
		if (inDrag) {
			repaint();
		}
	
public voidmouseEntered(java.awt.event.MouseEvent e)
Called when the mouse enters a component.

	
public voidmouseExited(java.awt.event.MouseEvent e)
Called when the mouse exits a component.

	
public voidmouseMoved(java.awt.event.MouseEvent e)
Invoked when the mouse moves; just update the status line with the new coordinates.

		showStatus("[" + e.getPoint().x + "," +
				 e.getPoint().y + "]");
	
public voidmousePressed(java.awt.event.MouseEvent e)
Called when the mouse has been pressed.

		Point p = e.getPoint();
		System.err.println("mousePressed at " + p);
		startX = p.x; startY = p.y;
		inDrag = true;
	
public voidmouseReleased(java.awt.event.MouseEvent e)
Called when the mouse has been released.

		inDrag = false;
		System.err.println("SELECTION IS " + startX + "," +
			startY + " to " + curX + "," + curY);
		oldX = -1;
		oldStartX = startX;
		oldStartY = startY;
		oldWidth = curX - startX;
		oldHeight = curY - startY;
	
public voidpaint(java.awt.Graphics g)

		int w = curX - startX, h = curY - startY;
		Dimension d = getSize();
		if (!inDrag) {	// probably first time through(?)
			g.drawImage(curImage, 0, 0, d.width, d.height, this);
			return;
		}
		System.err.println("paint:drawRect @[" + startX +"," + startY +
			"] size " + w + "x" + h);
		// Restore the old background, if previous selection
		if (oldStartX != -1) {
			g.setClip(oldStartX, oldStartY, oldWidth+1, oldHeight+1);
			g.drawImage(curImage, 0, 0, d.width, d.height, this);
			oldStartX = -1;
		}
		// Restore the background from previous motions of current drag
		if (oldX != -1) {
			g.setClip(startX, startY, w, h);
			g.drawImage(curImage, 0, 0, d.width+1, d.height+1, this);
		}
		// Draw the new rectangle
		g.setClip(0, 0, d.width, d.height);
		g.setColor(Color.red);
		g.drawRect(startX, startY, w, h);
		oldX = curX; oldY = curY;
	
public voidshowStatus(java.lang.String s)

		status.setText(s);
	
public voidupdate(java.awt.Graphics g)
This update() overrides Component's, to call paint() without clearing the screen (which has our main image on it, after all!

		paint(g);