2015-08-17 2 views
0

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

Теперь, похоже, работает нормально (вроде, по крайней мере, обнаруживает, когда вверх ключ удалены. Моя графика отсутствует.)

ответ

1

Вы не добавляете слушателя в JPanel.

Примечание: Я предлагаю вам изменить свой дизайн. Прямо сейчас, Display класс является как JPanel, так и Listener (что, на мой взгляд, не имеет смысла).

Но чтобы добавить слушателя в вашем коде сделать что-то подобное,

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

в конструкторе.

+0

Хорошо, я гибкий с дизайном. Фактически, изначально я написал слушателя клавиш в своем классе KeyHandler, но для упрощения я поместил его в Display. Я также подумал, что это может помочь решить мою проблему. Спасибо за ответ, я попробую. Непосредственно мне, возможно, придется идти скоро, но я вернусь позже сегодня, чтобы продолжать пытаться с этим. –

+0

Быстрый вопрос: Где я могу добавить эту строку кода? Конструктор? –

+0

@AshwinGupta, да. Добавьте его где-нибудь в конструктор. Предпочтительно ниже 'initTimer()'. – Codebender

Смежные вопросы