如何制作(keyPressed)KeyListener?

我试着写一个非常简单的程序,它允许你用箭头键控制精灵并在屏幕上移动。 据我所知,要做到这一点,我需要一个keyPressed() KeyListener 。 我相信我是基于Java Doc正确地做这个,但是当我按下指定键时它没有返回正确的输出。 有人可以告诉我我的代码有什么问题,如果可能的话,提供一个关于这个类的用法的简单例子吗? 谢谢!

(注意,代码未完成)

 import java.awt.*; import java.awt.event.ActionEvent; import java.awt.event.ActionListener; import java.awt.event.KeyEvent; import java.awt.event.KeyListener; import java.awt.image.BufferedImage; import java.io.File; import java.io.IOException; import javax.imageio.ImageIO; import javax.swing.*; public class Display extends JPanel implements ActionListener, KeyListener { Display() { // super(); loadImages(); initTimer(); this.addKeyListener(this); } BufferedImage sprite; Timer timer; int up = 0; public void loadImages() { File spriteImage = new File("Pacman_sprite.png"); try { sprite = ImageIO.read(spriteImage); } catch (IOException e) { System.out.println("Sprite import failed"); } } public void initTimer() { timer = new Timer(100, this); timer.start(); this.addKeyListener(this); } @Override public void keyTyped(KeyEvent e) { } @Override public void keyPressed(KeyEvent e) { int key = e.getKeyCode(); System.out.println("Key press registered"); //does not print this? if (key == KeyEvent.VK_UP) { System.out.println("sucess"); // does not print this? up++; repaint(); } } @Override public void keyReleased(KeyEvent e) { System.out.println("release"); } public void paintComponent(Graphics g) { super.paintComponent(g); setBackground(Color.WHITE); Graphics2D g2d = (Graphics2D) g; g2d.drawImage(sprite, 500, 500 + up, null); } @Override public void actionPerformed(ActionEvent e) { // TODO Auto-generated method stub repaint(); } 

}

编辑:可能在这里找到了答案。 我将密钥处理代码移动到一个名为KeyHandler的新类,然后将这两行添加到构造函数中:

 addKeyListener(new KeyHandler()); setFocusable(true); 

它现在似乎工作正常(有点,至少它检测到什么时候击中向上键。我的图形不是。)

您没有将侦听器添加到JPanel

注意:我建议你改变你的设计。 现在, Display类既是JPanel又是Listener (在我看来这没有意义)。

但是要在代码中添加监听器,请执行以下操作:

 this.addKeyListener(this); // This looks awkward right. That's why you should change the design. 

在你的构造函数中。