import java.awt.*;
import java.awt.Event;
import javax.swing.*;
import java.awt.event.*;

public class MoveRect extends JFrame {
  public class RectCanvas extends JPanel {
    public int left = 0;
    public int top = 0;
    public int width = 20;
    public int height = 20;

    protected boolean moving = false;
    protected int left_diff;
    protected int top_diff;

    public boolean point_in_gob (int x, int y) {
      return (x >= left) && (x <= left + width) &&
             (y >= top) && (y <= top + height);
    }

    public RectCanvas() {
      addMouseListener(new MouseAdapter() {
        public void mousePressed (MouseEvent event) {
          if (point_in_gob(event.getX(), event.getY())) {
            moving = true;
            left_diff = event.getX() - left;
            top_diff = event.getY() - top;
          }
        }
        public void mouseReleased(MouseEvent event) {
          if (moving) {
            moving = false;
            left = event.getX() - left_diff;
            top = event.getY() - top_diff;
            repaint();
          }
        }
        public void mouseClicked(MouseEvent event) {
        }
      });
      addMouseMotionListener(new MouseMotionAdapter() {
        public void mouseDragged(MouseEvent event) {
          if (moving) {
            left = event.getX() - left_diff;
            top = event.getY() - top_diff;
            repaint();
          }
        }
      });
    }
    public void paintComponent(Graphics g) {
      g.clearRect(0,0,getWidth(), getHeight());
      Color colorHandle = g.getColor();
      g.setColor(Color.red);
      g.fillRect(left, top, width, height);
      g.setColor(colorHandle);
    }

    public Dimension getPreferredSize() {
	return new Dimension(400, 300);
    }
  }

  
  public static void main(String args[]) {
    MoveRect app = new MoveRect("Move Rectangle Application");
    app.pack();
    app.setVisible(true);
  }
  public MoveRect(String frameTitle) {
    super(frameTitle);
    RectCanvas rect_canvas = new RectCanvas();
    getContentPane().add (rect_canvas);
    setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
  }
}