如何制作 (keyPressed) KeyListener?
How do I make a (keyPressed) KeyListener?
我正在尝试编写一个非常简单的程序,允许您使用箭头键控制精灵并在屏幕上移动。据我了解,要做到这一点,我需要 keyPressed()
KeyListener
。我相信我根据 Java 文档正确地执行了此操作,但是当我按下指定的键时它没有返回正确的输出。有人可以告诉我我的代码有什么问题吗,如果可能的话,提供一个简单的例子来说明这个 class 的用法?谢谢!
(注意,代码未完成)
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 的新 class,然后将这两行添加到构造函数中:
addKeyListener(new KeyHandler());
setFocusable(true);
它现在看起来工作正常(某种程度上,至少它检测到何时按下向上键。我的图形没有。)
您没有将侦听器添加到 JPanel
。
注意:我建议您更改设计。现在,Display
class 既是 JPanel
又是 Listener
(我认为这没有意义)。
但是要在您的代码中添加侦听器,请执行以下操作,
this.addKeyListener(this); // This looks awkward right. That's why you should change the design.
在你的构造函数中。
我正在尝试编写一个非常简单的程序,允许您使用箭头键控制精灵并在屏幕上移动。据我了解,要做到这一点,我需要 keyPressed()
KeyListener
。我相信我根据 Java 文档正确地执行了此操作,但是当我按下指定的键时它没有返回正确的输出。有人可以告诉我我的代码有什么问题吗,如果可能的话,提供一个简单的例子来说明这个 class 的用法?谢谢!
(注意,代码未完成)
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 的新 class,然后将这两行添加到构造函数中:
addKeyListener(new KeyHandler());
setFocusable(true);
它现在看起来工作正常(某种程度上,至少它检测到何时按下向上键。我的图形没有。)
您没有将侦听器添加到 JPanel
。
注意:我建议您更改设计。现在,Display
class 既是 JPanel
又是 Listener
(我认为这没有意义)。
但是要在您的代码中添加侦听器,请执行以下操作,
this.addKeyListener(this); // This looks awkward right. That's why you should change the design.
在你的构造函数中。