title: Compiler error saying I do not override abstract method keyReleased
body: <p>Writing a program that should draw shapes when given instructions. 
  Here are the instructions. However whenever I compile I get the message </p>
  
  <blockquote>
    <p>DrawShapes is not abstract and does not override abstract method keyReleased(java.awt.event.KeyEvent) in java.awt.event.KeyListener". </p>
  </blockquote>
  
  <p>I've already put the method <code>keyReleased</code> in the program so I don't know why it keep saying I haven't override the abstract method <code>keyReleased</code>. I haven't been able to compile the program, but I'm also fairly certain the program wouldn't work even if it compiled. Thank you!</p>
  
  <blockquote>
    <p>Write a program that will allow the user to draw a shape with a mouse.
    The shape to draw should be determined by keyPressed event using the
    following keys: c draws a circle, o draws an oval, r draws a rectangle
    and l draws a line.  The size and placement of the shape should be
    determined by mousePressed and mouseReleased events.  Display the name
    of the current shape in a JLabel in the SOUTH region of a
    BorderLayout.  The initial shape should default to a circle.  Make
    sure the shape displays in the direction of the movement of the mouse.
    Use JFrame and Paint .  You should have two files: ShapesViewer and
    DrawShapes (20 points)</p>
  </blockquote>
  
  <pre><code>import java.awt.*;
  import java.awt.event.*;
  import javax.swing.*;
  import java.awt.AlphaComposite;
  import java.awt.BasicStroke;
  import java.awt.BorderLayout;
  import java.awt.Color;
  import java.awt.Graphics;
  import java.awt.Graphics2D;
  import java.awt.Point;
  import java.awt.RenderingHints;
  import java.awt.Shape;
  import java.awt.event.MouseAdapter;
  import java.awt.event.MouseEvent;
  import java.awt.event.MouseMotionAdapter;
  import java.awt.geom.Line2D;
  import java.awt.geom.Rectangle2D;
  import java.util.ArrayList;
  import java.awt.geom.Ellipse2D;
  import java.awt.event.KeyEvent;
  
  
  import javax.swing.JComponent;
  import javax.swing.JFrame;
  
  public class DrawShapes extends JFrame implements KeyListener{
  String key;
  
  
    public DrawShapes()
    {
      this.setSize(300, 300);
      this.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
      this.add(new PaintSurface(), BorderLayout.CENTER);
      this.setVisible(true);
    }
  
    private class PaintSurface extends JComponent
    {
      ArrayList&lt;Shape&gt; shapes = new ArrayList&lt;Shape&gt;();
  
      Point startDrag, endDrag;
  
      public PaintSurface() {
  
  
        this.addMouseListener(new MouseAdapter()
        {
          public void mousePressed(MouseEvent e) {
            startDrag = new Point(e.getX(), e.getY());
            endDrag = startDrag;
            repaint();
          }
  
          public void mouseReleased(MouseEvent e) {
                    Shape r;
  
  
          if (key.equals("l"))
          {
               r = makeLine(startDrag.x, startDrag.y, endDrag.x, endDrag.y);
          }
  
  
  
          if (key.equals("o"))
          {
               r = makeOval(startDrag.x, startDrag.y, endDrag.x, endDrag.y);
          }
  
          if (key.equals("r"))
          {
               r = makeRectangle(startDrag.x, startDrag.y, endDrag.x, endDrag.y);
          }
  
  
          else
          {
              r = makeCircle(startDrag.x, startDrag.y, endDrag.x, endDrag.y);
          }
  
            shapes.add(r);
            startDrag = null;
            endDrag = null;
            repaint();
          }
        });
  
  
        this.addMouseMotionListener(new MouseMotionAdapter()
        {
          public void mouseDragged(MouseEvent e) {
            endDrag = new Point(e.getX(), e.getY());
            repaint();
          }
        });
      }
      private void paintBackground(Graphics2D g2){
        g2.setPaint(Color.LIGHT_GRAY);
  
  
  
      }
      public void paint(Graphics g) {
        Graphics2D g2 = (Graphics2D) g;
  
  
  
  
        for (Shape s : shapes)
        {
          g2.setPaint(Color.BLACK);
          g2.draw(s);
          g2.fill(s);
        }
  
        if (startDrag != null &amp;&amp; endDrag != null) {
          g2.setPaint(Color.LIGHT_GRAY);
          Shape r;
  
  
          if (key.equals("l"))
          {
               r = makeLine(startDrag.x, startDrag.y, endDrag.x, endDrag.y);
          }
  
  
  
          if (key.equals("o"))
          {
               r = makeOval(startDrag.x, startDrag.y, endDrag.x, endDrag.y);
          }
  
          if (key.equals("r"))
          {
               r = makeRectangle(startDrag.x, startDrag.y, endDrag.x, endDrag.y);
          }
  
  
          else
          {
              r = makeCircle(startDrag.x, startDrag.y, endDrag.x, endDrag.y);
          }
  
          g2.draw(r);
        }
      }
  
      private Rectangle2D.Float makeRectangle(int x1, int y1, int x2, int y2)
      {
        return new Rectangle2D.Float(Math.min(x1, x2), Math.min(y1, y2), Math.abs(x1 - x2), Math.abs(y1 - y2));
      }
  
      private Ellipse2D.Float makeCircle(int cx1, int cy1, int cx2, int cy2)
      {
        return new Ellipse2D.Float(Math.min(cx1, cx2), Math.min(cy1, cy2), Math.abs(cx1 - cx2), Math.abs(cx1 - cx2));
      }
  
      private Ellipse2D.Float makeOval(int ox1, int oy1, int ox2, int oy2)
      {
        return new Ellipse2D.Float(Math.min(ox1, ox2), Math.min(oy1, oy2), Math.abs(ox1 - ox2), Math.abs(oy1 - oy2));
      }
  
          private Line2D.Float makeLine(int lx1, int ly1, int lx2, int ly2)
      {
        return new Line2D.Float(Math.min(lx1, lx2), Math.min(ly1, ly2), Math.abs(lx1 - lx2), Math.abs(ly1 - ly2));
      }
  
      public void keyPressed(KeyEvent event)
      {
          key = event.getKeyText(event.getKeyCode());
      }
  
  
      public void keyReleased(KeyEvent event)
      {
  
      }
  
      //handle press of any action key
      public void keyTyped(KeyEvent event)
      {
  
      }
  
    }
  }
  </code></pre>
  
  <p>......</p>
  
  <pre><code>import javax.swing.*;
  
  public class ShapeViewer
  {
  
      //Creates and displays the application frame
      public static void main(String[] args)
      {
          JFrame ShapeViewer = new JFrame("Draw Stuff");
          ShapeViewer.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
  
          ShapeViewer.getContentPane().add(new DrawShapes());
  
          ShapeViewer.pack();
          ShapeViewer.setVisible(true);
      }
  
  
  }
  </code></pre>