我试图编写一个非常简单的程序,使您可以使用箭头键控制精灵并在屏幕上移动。据我了解,要做到这一点,我需要一个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.


在您的构造函数中。

关于java - 如何制作(keyPressed)KeyListener?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/32046512/

10-11 02:44