目前我正在使用Java制作关卡编辑器。 级别在JPanel中。在这个JPanel中,我把游戏元素(英雄,敌人,树,墙......)用于每个元素我使用class.GameElement。
public class GameElement extends JPanel
{
protected int posX, posY;
private Color color;
public GameElement(int x, int y, Color color)
{
this.posX = x;
this.posY = y;
this.color = color;
}
public void paintComponent(Graphics g)
{
super.paintComponent(g);
g.setColor(color);
g.fillRect(0, 0, 50, 50);
}
}
GameElement类也是一个JPanel。我想通过使用KeyListener来移动游戏元素英雄。
import java.awt.Color;
import java.awt.event.*;
public class Hero extends Entity implements KeyListener
{
public Hero(int x, int y, Color color)
{
super(x, y, color);
this.setFocusable(true);
this.addKeyListener(this);
}
public void keyPressed(KeyEvent k)
{
if(k.getKeyCode() == KeyEvent.VK_UP)
{
this.move(0, -1);
}
else if(k.getKeyCode() == KeyEvent.VK_DOWN)
{
this.move(0, 1);
}
else if(k.getKeyCode() == KeyEvent.VK_LEFT)
{
this.move(-1, 0);
}
else if(k.getKeyCode() == KeyEvent.VK_RIGHT)
{
this.move(1, 0);
System.out.println("test");
}
}
public void keyTyped(KeyEvent k)
{
}
public void keyReleased(KeyEvent k)
{
}
}
当我启动Level编辑器时。英雄在我的屏幕上显示成功,但是当我按下按键时它不会移动。是因为我没有专注于正确的JPanel?
答案 0 :(得分:6)
并非您专注于错误的JPanel
,而是JPanel
无法集中注意力,因此无法与KeyEvents
互动。这就是为什么在Swing中最好使用Key Bindings,即使组件没有焦点,也可以将Action映射到KeyStroke。
答案 1 :(得分:1)
您可以将AWTEventListener添加到默认Toolkit以监听所有关键事件,而不是取决于哪个元素具有焦点(仅应用程序必须具有焦点):
AWTEventListener theListener = new AWTEventListener() {
@Override
public void eventDispatched(AWTEvent event) {
System.out.println(event);
}
};
Toolkit toolkit = Toolkit.getDefaultToolkit();
toolkit.addAWTEventListener(theListener, AWTEvent.KEY_EVENT_MASK);
修改强>
AWTEvents
是一种低级别的活动,更喜欢使用ActionMap / InputMap(或只是registerKeyboardAction)