How do I make a (keyPressed) KeyListener?

2019-03-04 02:51发布

问题:

Im trying to write a very simple program that allows you to control a sprite with arrow keys and move around the screen. From what I understand, to do this I need a keyPressed() KeyListener. I believe Im doing this correctly based on the Java Doc but its not returning the correct output when I press the designated key. Can someone please tell me what is wrong with my code, and if possible, provide a simple example of the usage of this class? Thanks!

(Note, code is unfinished)

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();
}

}

EDIT: May have found the answer here. I moved the key handling code to a new class called KeyHandler then added these two lines to the constructor:

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

It now appears to be working just fine (sort of, at least it is detecting when the up key is hit. My graphics aren't.)

回答1:

You are not adding the listener to the JPanel.

Note: I would suggest you to change your design. Right now, Display class is both a JPanel and a Listener (which doesn't make sense in my opinion).

But to add the listener in your code do something like,

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

in your constructor.