簡體   English   中英

如何制作(keyPressed)KeyListener?

[英]How do I make a (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.

在您的構造函數中。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM