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