Почему не вызывается метод keyPressed? - PullRequest
3 голосов
/ 21 марта 2011

Я делаю боевую игру на Java для проекта и пытаюсь заставить изображение двигаться и перекрашивать через панель, реагирующую на клавиатуру (keyEvents). Я пытаюсь сделать это, используя переключатель в методе keyPressed, добавляя keyListener на панель. Я следовал примеру в моей книге по Java, и код, который я написал, почти такой же, но он просто не будет работать.

Что мне действительно интересно, так это то, почему он вообще не реагирует на keyEvents. Программа прекрасно компилируется и все, пока ничего не происходит. Я понятия не имею, что происходит не так. Он не достигнет точки останова в методе keyPressed(), если я его сделаю, и не достигнет println(), если я его туда вставлю. Так что метод keyPressed() вообще не реагирует. Я также проверил и убедился, что панель фокусируется, поэтому я уверен, что она имеет фокус клавиатуры.

public class MovePanel extends JPanel implements KeyListener {
    private ImageIcon currentImage, facingLeft, facingRight;
    private int position;
    private final int MOVEMENT;
    private GameFrame gameFrame;
    private URL lefturl, righturl;

    public MovePanel(GameFrame gameFrame) {
        // Taking in a gameFrame to be able to swap the active panel 
        // (not really relevant).
        this.gameFrame = gameFrame;

        // Adding the key listener here.
        addKeyListener(this);

        // These are just the Images I'm using to test. 
        // Trying to get it to swap from one to the other.
    lefturl = getClass().getResource("/Images/facingLeft.jpg");
    righturl = getClass().getResource("/Images/facingRight.jpg");

    facingLeft = new ImageIcon(lefturl);
    facingRight = new ImageIcon(righturl);

    currentImage = facingLeft;
    position = 50;
    MOVEMENT = 30;

    setBackground(Color.red);
    setPreferredSize(new Dimension(600,300));

        // Calling this method so that the panel will react 
        // to the keyboard without having to be clicked.
    setFocusable(true);
    }

    // This is just the paintComponent method which works fine to paint the image
    // when starting the game.
    public void paintComponent(Graphics page) {
    super.paintComponent(page);
    currentImage.paintIcon(this, page, position, 170);
    }

    // No matter what I try to do inside the keyPressed method
    // it doesnt seem to react at all.
    public void keyPressed(KeyEvent e) {

        // This switch is to make the method react accordingly to the keys pressed.
        switch (e.getKeyCode()) {
        case KeyEvent.VK_LEFT: 

            // Here I'm changing the "active" image and the position 
            // by changing the position variable which is used 
            // to determine the x placement of the image.
            // This case is suppused to react if the left arrow key is pressed.
            currentImage = facingRight;
            position -= MOVEMENT;
            break; 
        case KeyEvent.VK_RIGHT: 
            currentImage = facingRight;
            position += MOVEMENT;
            break; 

        // This case is to exit to the menu when escape is pressed.
        case KeyEvent.VK_ESCAPE: 
            gameFrame.setMenuPanelActive();
            break; 
        }
        // After reacting to any of the proper keys pressed 
        // I'm trying to repaint which will use the
        // paintComponent method to paint the new image in its new position.
        repaint();
    }
    // I have empty definitions for the other 
    // implemented methods but won't be posting them.
}

Кто-нибудь знает, почему это не работает? Почему метод keyPressed() не реагирует?

1 Ответ

4 голосов
/ 21 марта 2011

Я не вижу код, как показано ниже

Вы должны вызвать следующую строку, где вы создаете экземпляр MovePanel

 MovePanel.requestFocus();      // Give the panel focus.



public class demo extends JFrame 
{
    MovePanel  panel;

    public demo () 
    {
        panel= new MovingTextPanel();
        this.getContentPane().setLayout(new BorderLayout())
        this.setTitle("Demo");
        this.pack();
        panel.requestFocus();      // Give the panel focus.
    }
}

В вашей MovePanel добавьте setFocusable в true

 public MovePanel(GameFrame gameFrame) {

        this.setFocusable(true);   // Allow this panel to get focus.
        // Adding the key listener here.
        addKeyListener(this);

Еще несколько следов

- Characters (a, A, #, ...) - handled in the keyTyped() listener.
- Virtual keys (arrow keys, function keys, etc) - handled with keyPressed() listener.
- Modifier keys (shift, alt, control, ...) - Usually their status (up/down) is tested by calls in one of the other listeners, rather than in keyPressed().

  public void keyTyped(KeyEvent e) {
    System.out.println(e.toString());
  }
  public void keyPressed(KeyEvent e) {
   System.out.println(e.toString());
  }
  public void keyReleased(KeyEvent e) {
    System.out.println(e.toString());
  }
...