java frame 添加 方向键监听问题

 package Demo;

import java.awt.Canvas;
import java.awt.Color;
import java.awt.Component;
import java.awt.Frame;
import java.awt.Graphics;
import java.awt.Image;
import java.awt.Panel;
import java.awt.event.KeyEvent;
import java.awt.event.KeyListener;
import java.awt.image.ImageObserver;

import javax.swing.ImageIcon;

public class Demo  {
    frame f = null;
    public Demo(){
        f = new frame();
        Canvas c = new Canvas();
        Panel p = new Panel();
        f.setLayout(null);
        p.setLayout(null);
        f.setSize(600, 600);
        c.setSize(600, 600);

        f.add(p);
        p.add(c);
        f.requestFocus();
        f.addKeyListener(f);
        f.setBackground(Color.black);
        f.setVisible(true);
    }
    public static void main(String[] args)
    {
        Demo d = new Demo();
    }
}
class frame extends Frame implements KeyListener{
    private Image img = null;
    private int x =50;
    private int y = 50;
    private ImageIcon ii = new ImageIcon("D:\\Eclipse\\WORKPLACE\\image\\ccr.jpg");
    public frame(){
        super();
    }
    /*public void Frame(){
        frame f = new frame();
        Panel p = new Panel();
        Canvas c = new Canvas();
        f.setSize(300, 300);
        f.add(p);
        p.setSize(300, 300);
        p.add(c);
        c.setSize(300, 300);
        f.setVisible(true);
    }*/
    @Override
    public void paint(Graphics g)
    {
         super.paint(g);  

        img = ii.getImage();
        g.drawImage(img, x, y,15,15, this);
    }
    @Override
    public void keyTyped(KeyEvent e) {
        // TODO Auto-generated method stub
        int z;
        switch(e.getKeyCode())  
        {  
            case KeyEvent.VK_UP:  
                y-=7;  
                //调用repaint()函数,重新绘制小球位置  
               // z=1;
                this.repaint();  
                break;  
            case KeyEvent.VK_DOWN:  
                y+=7;  
                //调用repaint()函数,重新绘制小球位置  
                //z=2;
                this.repaint();  
                break;  
            case KeyEvent.VK_LEFT:  
                x-=7;  
                //调用repaint()函数,重新绘制小球位置  
               // z=3;
                this.repaint();  
                break;  
            case KeyEvent.VK_RIGHT:  
                x+=7;  
                //调用repaint()函数,重新绘制小球位置  
                //z=4;
                this.repaint();  
                break;  
        }  
    }
    @Override
    public void keyPressed(KeyEvent e) {


    }
    @Override
    public void keyReleased(KeyEvent e) {
        // TODO Auto-generated method stub

    }

}

各位大神 帮下忙 这个addKeyListener 有点不清楚 感觉这个地方是错的 才不会动的