为什么不调用keyPressed方法?

时间:2011-03-21 14:09:39

标签: java user-interface keylistener keyevent

我正在用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}}方法不会做出反应?

1 个答案:

答案 0 :(得分:4)

我看不到下面的代码

你应该在下面的行中调用你创建 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());
  }