java - JPanel 中的 JPanel 不听 KeyListener

标签 java swing jpanel keylistener key-bindings

目前我正在用 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 吗?

最佳答案

这并不是因为您将注意力集中在错误的 JPanel 上,而是因为 JPanel 不可聚焦,因此无法与 KeyEvents 交互。这就是为什么在 Swing 中最好使用 Key Bindings即使组件没有焦点,它也允许您将 Action 映射到 KeyStroke。

example

关于java - JPanel 中的 JPanel 不听 KeyListener,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14234803/

相关文章:

java - JScrollPane 中具有空布局的 JPanel - 看不到元素

java - 如何将 JFrame 放入 Java Swing 中现有的 JPanel 中?

Java:最简单的整数哈希

Java 多按钮 Action

java - X clicked/alt-F4 和 windowsclosing() 事件之间的事件

java - 如何在 Java Swing 中抓取鼠标?

java - JSON中如何按属性进行计数?

java - 当 com.fasterxml.aalto-xml 位于 Maven 依赖项中时解析 XML 时出现问题

java - 如何在 jtable 中设置相同的颜色并在 java 中将不同的颜色设置为不同的结果

java - 圆形 JPanel Swing