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/

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);