提问:按键监听与实践不匹配:按了下键不动(按左右键才向下移动) 按下右键向东南方(上建和右键才向右移动)其他两个键是正常的

按键不匹配
按了下键不动(按左右键才向下移动)
按下右键向东南方(上建和右键才向右移动)其他两个键是正常的.
被注释掉的双缓冲代码效果不佳,就是不会实时更新。

public class PlanGame extends Frame {
    private Image offScreenImage = null;
    Image bj = GameUtil.getImage("/images/bj.jpg");
    Image planeImage = GameUtil.getImage("/images/plane.png");
    //static int count = 0;
    Plane p1 = new Plane(planeImage,100,100,7);
    boolean right,left,up,down;

    @Override
    public void paint(Graphics g){   // g是一只画笔  系统会自动调用paint

        g.drawImage(bj,0,0,Constant.GAME_WIDTH,Constant.GAME_HEIGHT,null);
        p1.drawMyself(g);

        if (left){ p1.x -= p1.speed; }
        if (right){ p1.x += p1.speed; }
        if (up){ p1.y -= p1.speed; }
        if (right){ p1.y += p1.speed; }
    }

    //初始化窗口
    public void lunchFrame() {
        this.setTitle("飞机大战");
        setVisible(true);//设置窗口可视化
        setLocation(400, 100);//设置窗口位置
        setSize(Constant.GAME_WIDTH, Constant.GAME_HEIGHT);//设置窗口大小

        //设置窗口关闭的动作
        this.addWindowListener(new WindowAdapter() {
            @Override
            public void windowClosing(WindowEvent e) {
                System.exit(0);
            }
        });

        //启动重画窗口的线程
        new PaintThread().start();
        //启动键盘监听
        this.addKeyListener(new KeyMonitor());

    }

    /**
     * 定义了一个重画窗口的线程类
     * 定义成内部类是为了方便直接使用外部窗口类的相关方法
     */
    class PaintThread extends Thread {
        @Override
        public void run() {
            while (true) {
                repaint();     //内部类可以直接调用外部类的成员
                try {
                    Thread.sleep(50);      //1s = 1000ms; 一秒画20次  (20*50 = 1000);
                } catch (InterruptedException e) {
                    e.printStackTrace();
                }
            }
        }
    }
    class KeyMonitor extends KeyAdapter {
        @Override
        public void keyPressed(KeyEvent e) {
            System.out.println("按下键:"+ e.getKeyCode());
            /*
            if (e.getKeyCode()==KeyEvent.VK_RIGHT){
                right = true;
            }
             */
            switch (e.getKeyCode()){
                case 65:
                    left = true;
                    break;
                case 68:
                    right = true;
                    break;
                case 87:
                    up = true;
                    break;
                case 83:
                    down = true;
                    break;
            }
        }

        @Override
        public void keyReleased(KeyEvent e) {
            System.out.println("抬起:"+ e.getKeyCode());
            switch (e.getKeyCode()){
                case 65:
                    left = false;
                    break;
                case 68:
                    right = false;
                    break;
                case 87:
                    up = false;
                    break;
                case 83:
                    down = false;
                    break;
            }
        }
    }

    /**
     * 双缓冲:即在内存中创建一个与屏幕绘画区域一致的对象,
     * 现将图形绘制到内存中的这个对象上,
     * 再一次性将这个对象上的图形拷贝到屏幕上,
     * 这样加快绘图速度,绘图更加高效。
     *
     * @param g
     *
     */
//    public void update(Graphics g){
//        if (offScreenImage == null){
//            offScreenImage = this.createImage(Constant.GAME_WIDTH,Constant.GAME_HEIGHT);//这是游戏窗口的宽度和高度
//
//            Graphics gOff = offScreenImage.getGraphics();
//            paint(gOff);
//            g.drawImage(offScreenImage,0,0,null);
//        }
//    }

    public static void main(String[] args) {
        PlanGame planGame = new PlanGame();
        planGame.lunchFrame();
    }

写了两个right语句