Java 键盘侦听器不工作?
我想玩蛇游戏。但是我不能移动一个长方形的盒子(那就是蛇)。 很抱歉问这样的问题!但是我是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
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();
}
有关更多信息,请参阅和
此外,键侦听器是键盘输入的低级接口。确保面板可调焦且具有焦点。聚焦可能非常棘手。使用键绑定要好得多,有关更多详细信息,请参阅 对代码块使用一致的逻辑缩进。代码的缩进旨在帮助人们理解程序流程。