//SimpleCanvas.java package util; import java.awt.*; import java.awt.event.*; public class SimpleCanvas extends Canvas { // default size of Canvas public static final int DEFAULT_WIDTH = 400; public static final int DEFAULT_HEIGHT = 400; public SimpleCanvas (int width, int height) { super(); mySize = new Dimension(width, height); // set up for interaction addMouseMotionListener( new MouseMotionListener() { public void mouseMoved(MouseEvent e) { SimpleCanvas.this.mouseMoved(e.getPoint()); } public void mouseDragged(MouseEvent e) { SimpleCanvas.this.mouseDragged(e.getPoint()); } }); addMouseListener( new MouseListener() { public void mousePressed(MouseEvent e) { SimpleCanvas.this.mousePressed(e.getPoint()); } public void mouseReleased(MouseEvent e) { SimpleCanvas.this.mouseReleased(e.getPoint()); } public void mouseClicked(MouseEvent e) { SimpleCanvas.this.mouseClicked(e.getPoint()); } public void mouseEntered(MouseEvent e) { SimpleCanvas.this.mouseEntered(e.getPoint()); } public void mouseExited(MouseEvent e) { SimpleCanvas.this.mouseExited(e.getPoint()); } }); addKeyListener( new KeyListener() { public void keyPressed(KeyEvent e) { SimpleCanvas.this.keyPressed(KeyEvent.getKeyText(e.getKeyCode())); } public void keyReleased(KeyEvent e) { SimpleCanvas.this.keyTyped(KeyEvent.getKeyText(e.getKeyCode())); } public void keyTyped(KeyEvent e) { SimpleCanvas.this.keyTyped("" + e.getKeyChar()); } }); } // provide a reasonable alternative public SimpleCanvas (Dimension d) { this(d.width, d.height); } // provide a reasonable default public SimpleCanvas () { this(SimpleCanvas.DEFAULT_WIDTH, SimpleCanvas.DEFAULT_HEIGHT); } // Do not clear the screen // instead call paint() method with buffergraphics // and paint the image public void update (Graphics g) { Rectangle bounds = getBounds(); // set up for animation if ((myBuffer == null) || (bounds.width != mySize.width) || (bounds.height != mySize.height)) { mySize.width = bounds.width; mySize.height = bounds.height; myBuffer = createImage(mySize.width, mySize.height); myBufferGraphics = myBuffer.getGraphics(); } // clear image in preparation for next frame myBufferGraphics.clearRect(0, 0, mySize.width, mySize.height); // give subclasses a chance to paint paint(myBufferGraphics); // then copy off-screen buffer onto the screen g.drawImage(myBuffer, 0, 0, this); } // provide reasonable size defaults public Dimension getMinimumSize () { return new Dimension(mySize); } public Dimension getPreferredSize () { return new Dimension(mySize); } // override the following to provide meaningful reactions // by default they do nothing public void mouseMoved(Point pt) {} public void mouseDragged(Point pt) {} public void mousePressed(Point pt) {} public void mouseReleased(Point pt) {} public void mouseClicked(Point pt) {} public void mouseEntered(Point pt) {} public void mouseExited(Point pt) {} public void keyPressed(String key) {} public void keyReleased(String key) {} public void keyTyped(String key) {} // size of the canvas private Dimension mySize; // do double-buffering automagically private Image myBuffer; private Graphics myBufferGraphics; }