1  /*
  2   *  MouseEvents.java
  3   *
  4   *  MouseEvents and movable objects
  5   */
  6  
  7  import java.applet.*;
  8  import java.awt.*;
  9  import java.awt.event.*;
 10  
 11  public class MouseEvents extends Applet 
 12                           implements MouseListener, MouseMotionListener {
 13                            
 14    // Instance variables:
 15    private final int numObj = 3;    // number of movable objects
 16    private MovableObject object[];  // array of movable objects
 17    private Image buffer;            // image object for double buffering
 18    private Graphics gOffScreen;     // graphics object for double buffering
 19    
 20    // Mouse handling variables:
 21    private int current = -1;        // index of object being dragged
 22    private int hit = -1;            // index of object containing cursor
 23    private int xoffset = 0;         // relative x-coordinate of mouse click
 24    private int yoffset = 0;         // relative y-coordinate of mouse click
 25    
 26    // Default object color:
 27    private final Color objColor = Color.cyan;
 28    // Selected object color:
 29    private final Color objColorSelect = Color.red;
 30    // Applet colors:
 31    private final Color bgColor = Color.black;
 32    private final Color fgColor = Color.white;
 33  
 34    public void init() {
 35    
 36      setBackground( bgColor );
 37      setForeground( fgColor );
 38  
 39      // Instantiate object array:
 40      object = new MovableObject[ numObj ];
 41  
 42      // Instantiate a rectangle:
 43      object[0] = new MovableRectangle( 10, 10, 100, 100 );
 44      object[0].setColor( objColor );
 45  
 46      // Instantiate a circle:
 47      object[1] = new MovableOval( 200, 10, 100, 100 );
 48      object[1].setColor( objColor );
 49  
 50      // Instantiate a triangle:
 51      object[2] = new MovableTriangle( 10, 200, 100, 100 );
 52      object[2].setColor( objColor );
 53  
 54      // Create an off-screen image for double buffering:
 55      buffer = createImage( getSize().width, getSize().height );
 56      // Get off-screen graphics context:
 57      gOffScreen = buffer.getGraphics(); 
 58  
 59      // Register the applet to listen for ALL mouse events:
 60      addMouseListener( this );
 61      addMouseMotionListener( this );
 62      
 63    }  // end method init()
 64  
 65    // Override java.awt.Component.update:
 66    public void update( Graphics g ) {
 67      // Fill background:
 68      gOffScreen.setColor( getBackground() );
 69      gOffScreen.fillRect( 1, 1, getSize().width - 2, getSize().height - 2 );
 70      // Draw boundary:
 71      gOffScreen.setColor( getForeground() );
 72      gOffScreen.drawRect( 0, 0, getSize().width - 1, getSize().height - 1 );
 73      paint( gOffScreen );
 74      
 75      // Draw the buffer in the applet window:
 76      g.drawImage( buffer, 0, 0, this );
 77    }
 78    
 79    // Override java.awt.Component.paint:
 80    public void paint( Graphics g ) {
 81      // Paint each object:
 82      for ( int i = 0; i < numObj; i++ ) {
 83        object[i].paint(g);
 84      }
 85    }
 86  
 87    // MouseMotionListener event handlers:
 88    public void mouseMoved( MouseEvent e ) {
 89      hit = -1;
 90      for ( int i = 0; i < numObj; i++ ) {
 91        if ( object[i].contains( e.getX(), e.getY() ) ) {
 92          hit = i; break;
 93        }
 94      }
 95      
 96      for ( int i = 0; i < numObj; i++ ) {
 97        object[i].setColor( (i == hit) ? objColorSelect : objColor );
 98      }
 99      repaint();
100    }
101    public void mouseDragged( MouseEvent e ) {
102      if ( current != -1 ) {
103        int x = e.getX() + xoffset;
104        int y = e.getY() + yoffset;
105        object[current].setLocation( x, y );
106        repaint();
107      }
108    }
109  
110    // MouseListener event handlers:
111    public void mousePressed( MouseEvent e ) {
112      current = hit;
113      if ( current != -1 ) {
114        xoffset = object[current].getX() - e.getX();
115        yoffset = object[current].getY() - e.getY();
116      }
117    }
118    public void mouseReleased( MouseEvent e ) {
119      current = -1;
120    }
121    public void mouseClicked( MouseEvent e ) { }
122    public void mouseEntered( MouseEvent e ) { }
123    public void mouseExited( MouseEvent e ) { }
124  
125  }  // end class MouseEvents
126