JPanel中的JPanel不会监听KeyListener

Jor*_*rdi 1 java swing keylistener key-bindings jpanel

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

}
Run Code Online (Sandbox Code Playgroud)

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)
{

}
}
Run Code Online (Sandbox Code Playgroud)

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

Rei*_*eus 6

并不是说你专注于错误JPanel,而是JPanel不可聚焦,因此无法与之互动KeyEvents.这就是为什么在Swing中最好使用Key Bindings,它允许你将Action映射到KeyStroke,即使组件没有焦点也是如此.