【问题标题】:How do I make a (keyPressed) KeyListener?如何制作(keyPressed)KeyListener?
【发布时间】:2015-11-09 20:40:19
【问题描述】:

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

它现在似乎工作得很好(有点,至少它正在检测何时按下向上键。我的图形不是。)

【问题讨论】:

    标签: java swing keyboard keylistener java-2d


    【解决方案1】:

    您没有将侦听器添加到JPanel

    注意:我建议您更改您的设计。现在,Display 类既是 JPanel 又是 Listener(我认为这没有意义)。

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

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

    在你的构造函数中。

    【讨论】:

    • 好吧,我的设计很灵活,事实上,最初我在它自己的名为 KeyHandler 的类中编写了键监听器,但为了简单起见,我把它放在了 Display 中。我还认为它可能有助于解决我的问题。谢谢你的回答,我试试看。不幸的是,我可能很快就要走了,但我会在今天晚些时候回来继续尝试这些东西。
    • 快速提问:我在哪里添加这行代码?构造函数?
    • @AshwinGupta,是的。在构造函数的某个地方添加它。最好在initTimer()以下。
    • 我会通过将 print 语句放在 if 条件之前进行调试并打印 e.getKeyCode()
    • 感谢您的回答!实际上确实有帮助。我完全按照你说的做了,我添加了 setFocusable(true) 方法调用。我接受你的回答,如果你想让其他有这个问题的人看到它,你也可以将 setFocusable 添加到你的答案中。
    猜你喜欢
    • 2011-10-27
    • 1970-01-01
    • 2011-07-09
    • 2012-12-11
    • 2013-07-16
    • 2012-11-15
    • 2015-07-12
    • 2021-05-19
    • 1970-01-01
    相关资源
    最近更新 更多