import javax.swing.*;
import java.awt.*;
import java.awt.event.*;
public class DrawArea extends JPanel
{
   MultiSelectListener msl = new MultiSelectListener();
   private int beginX_, beginY_;
   private Rectangle rectangle_;
   
   public DrawArea()
   {
      super();
      addMouseMotionListener(msl);
      addMouseListener(msl);
      add(new JLabel("Click and drag to draw a rectangle") );
   }
   
   public static void main(String []argc)
   {
      JFrame f = new JFrame();
      f.getContentPane().add(new DrawArea());
      f.setSize(600, 400);
      f.setVisible(true);
   }
   

 
   class MultiSelectListener extends MouseMotionAdapter implements MouseListener
   {
      private int endX_ = -1, endY_ = -1;
      
      public void  mousePressed(MouseEvent ev)
      {
         beginX_ = ev.getX();
         beginY_ = ev.getY();         
      }
      public void mouseClicked(MouseEvent ev) 
      {         
      }
      public void mouseReleased(MouseEvent ev)
      {         
      }
      public void mouseEntered(MouseEvent ev)
      {         
      }
      public void mouseExited(MouseEvent ev)
      {         
      }
      
         
      public void mouseDragged(MouseEvent e)
      {
         endX_ = e.getX();
         endY_ = e.getY();
         
         // Which way is the user dragging?
         Rectangle rect = new Rectangle();
         // From upper-left?
         if(beginX_ < endX_ && beginY_ < endY_)
         {
            rect.x = beginX_;
            rect.y = beginY_;
            rect.width  = endX_ - beginX_;
            rect.height = endY_ - beginY_;
         }
         // From lower-left?
         if(beginX_ < endX_ && beginY_ > endY_)
         {
            rect.x = beginX_;
            rect.y = endY_;
            rect.width  = endX_ - beginX_;
            rect.height = beginY_ - endY_;        
         }
         // From upper-right?
         if(beginX_ > endX_ && beginY_ < endY_)
         {
            rect.x = endX_;
            rect.y = beginY_;
            rect.width  = beginX_ - endX_;
            rect.height = endY_ - beginY_;      
         }
         // From lower-right?
         if(beginX_ > endX_ && beginY_ > endY_)
         {
            rect.x = endX_;
            rect.y = endY_;
            rect.width  = beginX_ - endX_;
            rect.height = beginY_ - endY_;      
         }  
         
         
         Graphics g = getGraphics();
      
         g.setXORMode(getBackground());
         g.setColor(Color.blue);
         
        // erase the old rectange
        if (rectangle_ != null)
         g.drawRect(rectangle_.x, rectangle_.y, rectangle_.width, rectangle_.height);
        
         // draw the new one
         g.drawRect(rect.x, rect.y,rect.width, rect.height);
         // Track the last rectangle
         rectangle_ = rect;
      
      }
   }
   
}
