Im пытается написать очень простую программу, которая позволяет вам управлять спрайтом с помощью клавиш со стрелками и перемещаться по экрану. Из того, что я понимаю, для этого мне нужен keyPressed()
KeyListener
. Я считаю, что я делаю это правильно на основе Java Doc, но не возвращаю правильный результат, когда я нажимаю назначенный ключ. Может кто-нибудь, пожалуйста, скажите мне, что не так с моим кодом, и, если возможно, укажите простой пример использования этого класса? Благодаря!Как создать (KeyPressed) KeyListener?
(Обратите внимание, код незавершенной)
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: мая нашли ответ здесь. Я переместил ключ кода обработки нового класса под названием KeyHandler затем добавили эти две строки в конструкторе:
addKeyListener(new KeyHandler());
setFocusable(true);
Теперь, похоже, работает нормально (вроде, по крайней мере, обнаруживает, когда вверх ключ удалены. Моя графика отсутствует.)
Хорошо, я гибкий с дизайном. Фактически, изначально я написал слушателя клавиш в своем классе KeyHandler, но для упрощения я поместил его в Display. Я также подумал, что это может помочь решить мою проблему. Спасибо за ответ, я попробую. Непосредственно мне, возможно, придется идти скоро, но я вернусь позже сегодня, чтобы продолжать пытаться с этим. –
Быстрый вопрос: Где я могу добавить эту строку кода? Конструктор? –
@AshwinGupta, да. Добавьте его где-нибудь в конструктор. Предпочтительно ниже 'initTimer()'. – Codebender