AWT_Event-Queue-0线程NullPointerException异常 按键控图移动问题求助
Java Swing按键控制图片移动异常修复方案
空指针异常触发原因
- 成员变量
label未正确赋值:你在类顶部声明了成员变量JLabel label,但构造方法中再次用JLabel label = new JLabel(imageIcon);定义了同名局部变量,导致成员变量始终为null,在keyPressed方法调用label的方法时触发空指针。 - if判断语法错误:
keyPressed方法中if (e.getKeyCode() == KeyEvent.VK_UP);末尾多了分号,导致if条件完全失效。
额外必要修复项
JFrame默认使用BorderLayout布局,该布局下手动调用setLocation不生效,需要先将布局设置为绝对布局null,同时给label设置初始位置和尺寸。
修复后完整代码
import java.awt.event.*; import javax.swing.*; import java.awt.*; class MyFrame extends JFrame implements KeyListener { JLabel label; int x; int y; MyFrame(){ this.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); addKeyListener(this); // 设置绝对布局,允许手动控制组件位置 setLayout(null); ImageIcon imageIcon = new ImageIcon("C:\\Users\\jacob\\Downloads\\player.png"); Image image = imageIcon.getImage(); Image newimg = image.getScaledInstance(150, 150, java.awt.Image.SCALE_SMOOTH); imageIcon = new ImageIcon(newimg); // 直接给成员变量label赋值,不重新定义局部变量 label = new JLabel(imageIcon); // 设置label初始位置、宽高 label.setBounds(0,0,150,150); this.add(label); this.setSize(500, 500); this.setVisible(true); } @Override public void keyTyped(KeyEvent e) { } @Override public void keyPressed(KeyEvent e) { // 移除if末尾的分号,添加大括号包裹逻辑 if (e.getKeyCode() == KeyEvent.VK_UP) { label.setLocation(label.getX(), label.getY()-1); } if (e.getKeyCode() == KeyEvent.VK_DOWN) { label.setLocation(label.getX(), label.getY()+1); } if (e.getKeyCode() == KeyEvent.VK_LEFT) { label.setLocation(label.getX()-1, label.getY()); } if (e.getKeyCode() == KeyEvent.VK_RIGHT) { label.setLocation(label.getX()+1, label.getY()); } } @Override public void keyReleased(KeyEvent e) { } }
可选优化
Swing的KeyListener存在焦点捕获限制,只有窗口持有焦点时才能响应按键,后续如果需要更稳定的按键响应,可以改用Swing键绑定(Key Bindings)实现。
内容的提问来源于stack exchange,提问作者Jacob Ptak
相关产品推荐
相关产品推荐

