//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(); setSize(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) { Dimension size = getSize(); // set up for animation if ((myBuffer == null) || (size.width != myBuffer.getWidth(this)) || (size.height != myBuffer.getHeight(this))) { myBuffer = createImage(size.width, size.height); myBufferGraphics = myBuffer.getGraphics(); } // clear image in preparation for next frame myBufferGraphics.clearRect(0, 0, size.width, size.height); // give subclasses a chance to paint paint(myBufferGraphics); // then copy off-screen buffer onto the screen g.drawImage(myBuffer, 0, 0, this); } // 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) {} // do double-buffering automagically private Image myBuffer; private Graphics myBufferGraphics; }