1

目前我正在用 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)
{

}
}

当我启动关卡编辑器时。英雄在我的屏幕上显示成功,但是当我按下按键时它没有移动。是因为我没有专注于正确的 JPanel 吗?

4

2 回答 2

6

不是您专注于错误JPanel,而是JPanel无法聚焦,因此无法与KeyEvents. 这就是为什么在 Swing 中最好使用键绑定,即使组件没有焦点,也可以将动作映射到 KeyStroke。

例子

于 2013-01-09T12:15:23.727 回答
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

于 2013-01-09T12:27:07.950 回答