当前位置: 首页 > 知识库问答 >
问题:

JPanel中的KeyListener不重新强制任何键事件

邵和硕
2023-03-14

我正在制作一个游戏,当我在导入一个用户输入时,我遇到了这个问题。我向JPanel添加了一个KeyListener,但它根本不起作用。该程序由JFrame(WindowManager)中的JPanel(GameWindow)组成。游戏在GameLoop对象中启动,该对象可以运行。级别包含地图外观的所有信息。我读到KeyListener工作,如果组件是可聚焦的,所以我检查面板是否是可聚焦的,程序返回true。也许这是一个线程问题,但我不知道为什么。

public class GameWindow extends JPanel {

   private Level level;
   private GameLoop gameLoop;
   private LevelLoader levelLoader = new LevelLoader();
   private WindowManager windowParent; // A JFrame


public GameWindow(WindowManager windowParent){
    super();
    this.windowParent = windowParent;
    setBackground(Color.BLACK);
    gameLoop = new GameLoop(this);
    level = levelLoader.loadLevel(1);
    setFocusable(true);
    requestFocusInWindow();
    addKeyListener(new KeyListener() {
        @Override
        public void keyTyped(KeyEvent e) {
            System.out.println("typed");
        }

        @Override
        public void keyPressed(KeyEvent e) {
            System.out.println("pressed");
        }

        @Override
        public void keyReleased(KeyEvent e) {
            System.out.println("released");
        }
    });
    start();
}

private  void start(){
    Thread thread = new Thread(gameLoop);
    thread.start();
}

@Override
public Dimension getPreferredSize() {
    return new Dimension(600, 600);
}


@Override
protected void paintComponent(Graphics g) {
    super.paintComponent(g);
    Graphics2D graphics2D = (Graphics2D) g;
    graphics2D.setRenderingHint(RenderingHints.KEY_ANTIALIASING,RenderingHints.VALUE_ANTIALIAS_ON);
    level.paintLevel(g,getSize());
}

}

共有1个答案

祁凯泽
2023-03-14

问题解决了,我需要在JPanel添加到JFrame并变得可见后请求焦点。

 类似资料:
  • 问题内容: 我有一个使用从扩展的类的子类 我将一个对象添加到框架-中。现在,当我按下任意键盘键时,不会调用任何方法,并且似乎没有窗口焦点。我也尝试过调用,但仍然没有响应。 如何使它响应按键? 问题答案: 您是否为面板设置了面板本身?另外,您可能需要将面板设置为可聚焦。我通过此代码对其进行了测试,它似乎可以正常工作

  • 有人能告诉我为什么这也不管用吗?(我的第二个动作监听器是我的游戏所需的其他东西)

  • 问题内容: 我正在做一个涉及JPanel中的鼠标和键监听器的小项目。不幸的是,当我使用鼠标/键盘时,没有一个方法被调用。我之前曾使用过JPanels / JFrame / JApplet和JComponents。代码片段如下所示: 偏离主题:我不断收到错误消息您的帖子似乎包含格式错误的代码。请使用代码工具栏按钮或CTRL + K键盘快捷键将所有代码缩进4个空格。要获得更多编辑帮助,请单击[?]工具

  • 我的问题是,我需要制作一个不断更新的GUI,因为我得到的值可以从数据库中更改,并且我在图形区域中遇到了一些问题。 我使用Graphics2D中的Drawline和Drawstring打印数据库中的值,这些字符串和线条移动并更改值,所以我需要调用repaint();使用计时器使它们出现在jpanel中,问题是repaint();不是在绘制之前移除背景中的旧绘画,而是当我完全调整所有更新的大小时。 我

  • 额外信息:我是用BlueJ来从中,用4个类在basic程序中回答我的问题。我意识到很多人在互联网上说要使用键绑定而不是KeyListener,但我现在不明白键绑定... ---遵循装满鳗鱼的气垫船的建议,我将尝试使用键绑定。--- 所以Keybindings有两个“命令”来工作:输入和操作。