Java 键盘侦听器不工作?

Java 键盘侦听器不工作?,java,swing,Java,Swing,我想玩蛇游戏。但是我不能移动一个长方形的盒子(那就是蛇)。 很抱歉问这样的问题!但是我是java的初学者,我不知道代码中的问题在哪里 class Snakexx extends JPanel implements ActionListener , KeyListener{ public static int a,b,x,y; public int fooda,foodb; Random rnd ; Timer t = new Timer(1,this); public void keyP

我想玩蛇游戏。但是我不能移动一个长方形的盒子(那就是蛇)。 很抱歉问这样的问题!但是我是java的初学者,我不知道代码中的问题在哪里

    class Snakexx extends JPanel implements ActionListener , KeyListener{
public static int a,b,x,y;
public int fooda,foodb;
Random rnd ;
Timer t = new Timer(1,this);
public void keyPressed(KeyEvent e){
         if(e.getKeyCode()==e.VK_UP)
        {
        x=0;
        y=-1;
        }
        if(e.getKeyCode()==e.VK_LEFT)
        {
        x=-1;
        y=0;            
        }
        if(e.getKeyCode()==e.VK_DOWN)
        {
        x=0;
        y=1;
        }
        if(e.getKeyCode()==e.VK_RIGHT)
         {
            x=1;
            y=0;
            }
        }
public void keyTyped(KeyEvent e){}
public void keyReleased(KeyEvent f){}

protected Snakexx(){
rnd = new Random();
fooda=rnd.nextInt(1300);
foodb=rnd.nextInt(300);
a=20;
b=20;
t.start();
addKeyListener(this);
setFocusable(true);

} 



protected void paintComponent(Graphics g) {

super.paintComponent(g);
g.fillRect(a,b,10,10) ;
g.fillRect(fooda,foodb,10,10) ;
}
public void actionPerformed(ActionEvent e){
a+=x;
b+=y;
Graphics gr;
gr= new Snakexx().getGraphics();
gr.fillRect(a,b,10,10) ;

}
}

 public class Snake2{


 public static void main(String args[]) 
{
Snakexx abcd = new Snakexx();
JFrame jfrm = new JFrame("Snake Game");
jfrm.setSize(1300, 650);
jfrm.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
jfrm.setVisible(true);

jfrm.add(abcd);
}


}

计时器操作中似乎存在
NullPointerException
<代码>新Snakxx().getGraphics()是获取
图形
实例的不正确方法。这甚至是一个更大的问题,因为您实际上是在计时器的每一个滴答声上分配一个面板的新实例

不要在绘画中使用
getGraphics()
,因为它是临时缓冲区,在下次重新绘制时会被回收。是否在
paintComponent()
中绘制,并在需要时调用
repaint()

即时修复方法是添加
repaint()
并注释掉绘制代码,即:

public void actionPerformed(ActionEvent e) {
    a += x;
    b += y;
    // Graphics gr;
    // gr= new Snakexx().getGraphics();
    // gr.fillRect(a,b,10,10) ;

    repaint();
}
有关更多信息,请参阅和


此外,键侦听器是键盘输入的低级接口。确保面板可调焦且具有焦点。聚焦可能非常棘手。使用键绑定要好得多,有关更多详细信息,请参阅

对代码块使用一致的逻辑缩进。代码的缩进旨在帮助人们理解程序流程。