import java.awt.*; import java.awt.event.*; import java.awt.geom.*; import javax.swing.*; public class Main extends JFrame implements ActionListener, KeyListener { //*3 Timer callback /** * State of the animation, just a counter */ private int frameNumber = 1; //*1 Frame counter private Canvas canvas; public static void main (String [] args) { java.awt.EventQueue.invokeLater (new Runnable() { public void run() { new Main (); } }); } public Main () { // Window setup setSize (500, 500); setDefaultCloseOperation (JFrame.EXIT_ON_CLOSE); addKeyListener (this); //*4 KeyListener // Put a Canvas in canvas = new Canvas (this); add (canvas); setVisible (true); // Start timer Timer timer = new Timer (100, this); // 100 milliseconds //*2 Timer timer.start(); //*2 } public int getFrameNumber () { return frameNumber; } //*1 // Like a clock tick public void actionPerformed (ActionEvent e) { //*3 frameNumber++; //*3 canvas.repaint (); //*3 } // Methods for KeyListener public void keyPressed (KeyEvent e) { //*4 if (e.getKeyCode()==KeyEvent.VK_ESCAPE) System.exit (0); //*4 } public void keyReleased (KeyEvent e) { } public void keyTyped (KeyEvent e) { } }