snake是另一个类没有贴,在下面文件的Jpanel添加了键盘事件监听,还有个让蛇移动的线程,现在问题是蛇移动时间不开启的时候上下左右按键是有反应的,线程一开启再按键盘就没有反应了,但是里面有个“GO”按钮,作用是能改变蛇的方向,在蛇运动时候能够响应,请问这是怎么回事呢?package snakegame;import snakegame.Global;
import java.awt.*;
import java.util.logging.Level;
import java.util.logging.Logger;
import javax.swing.*;
import java.awt.event.*;
import java.awt.color.*;class Game extends JFrame{
    GamePanel panel = new GamePanel();    Game(){
        super();
        initComponent();
    }
    Game(String name){
        super(name);
        initComponent();
    }    private void initComponent(){        add(panel);        setSize(Global.WIDTH,Global.HEIGHT);
        setVisible(true);
        setDefaultCloseOperation(EXIT_ON_CLOSE);
    }    public static void main(String[] args){
        EventQueue.invokeLater(new Runnable(){
            public void run(){
                new Game("Game");
            }
        });
    }
}class GamePanel extends JPanel{
    final int SIZE = Global.SIZE;
    int i = 0;
    //Auto auto;
    private Graphics gra;
    Snake snake = new Snake();
    JButton b1 = new JButton("前进"),
            b2 = new JButton("GO!");    GamePanel(){
        super();
        init();
    }
    void init(){
        this.setSize(Global.WIDTH,Global.HEIGHT);
        add(b1);
        add(b2);
        b1.addActionListener(new ActionListener(){
                public void actionPerformed(ActionEvent evt) {
                    start();
                }
            });
        b2.addActionListener(new ActionListener(){
                public void actionPerformed(ActionEvent evt) {
                    snake.setDirection(snake.DOWN);
                }
            });
        this.setFocusable(true);//设置panel响应键盘监听
        this.addKeyListener(new KeyListener(){
            public void keyPressed(KeyEvent e){
                switch(e.getKeyCode()){
                    case KeyEvent.VK_UP :
                        System.out.println("UP pressed");
                        snake.setDirection(snake.UP);
                        break;
                    case KeyEvent.VK_DOWN :
                        System.out.println("DOWN pressed");
                        snake.setDirection(snake.DOWN);
                        break;
                    case KeyEvent.VK_LEFT :
                        System.out.println("LEFT pressed");
                        snake.setDirection(snake.LEFT);
                        break;
                    case KeyEvent.VK_RIGHT :
                        System.out.println("RIGHT pressed");
                        snake.setDirection(snake.RIGHT);
                        break;
                }
            }
            public void keyReleased(KeyEvent e){}
            public void keyTyped(KeyEvent e){}
        });
    }    void disPlay(){ 
        repaint();
        System.out.println("disPlay()");
    }
    @Override
    public void paintComponent(Graphics g){
        super.paintComponent(g);
        snake.drawSnake(g);
        g.setColor(Color.RED);
        System.out.println("paintComponent()");
    }
    public void start(){
       new Thread(new GameDriver()).start();
    }    
    private class GameDriver implements Runnable{
        @Override
        public void run(){
            while(true){
                try {
                    snake.move();
                    disPlay();
                    Thread.sleep(500);
                    System.out.println("run()");
                } catch (InterruptedException ex) {
                    Logger.getLogger(GamePanel.class.getName()).log(Level.SEVERE, null, ex);
                }
            }
        }
    }
    
}