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

Keylistener不适用于JPanel

戚繁
2023-03-14
public class TestPanel extends JPanel implements KeyListener{

    public TestPanel(){
        this.addKeyListener(this);
        this.setFocusable(true);
        this.requestFocusInWindow();
    }

    public void keyPressed(KeyEvent e) {
        if (e.getKeyCode() == KeyEvent.VK_RIGHT) {
            System.out.println("Right");

        }

        if (e.getKeyCode() == KeyEvent.VK_LEFT) {
            System.out.println("Left");
        }

    }

    public void keyTyped(KeyEvent e) {}
    public void keyReleased(KeyEvent e) {}
}
public class GamePanel extends JPanel implements ActionListener{

//Constructor
public GamePanel(){

    setupKeyBinding();
    this.setFocusable(true);
    this.requestFocusInWindow();


}

private void setupKeyBinding() {
    int condition = JComponent.WHEN_IN_FOCUSED_WINDOW;
    InputMap inMap = getInputMap(condition);
    ActionMap actMap = getActionMap();

    inMap.put(KeyStroke.getKeyStroke(KeyEvent.VK_LEFT, 0), "Left");
    actMap.put("Left", new leftAction());
}

private class leftAction extends AbstractAction {

       public void actionPerformed(ActionEvent e) {
          System.out.println("test");
       }
}

public void actionPerformed(ActionEvent e) {
    //some other game info
}
} 

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

共有1个答案

濮宇定
2023-03-14

如果你搜索这个问题,你会看到它被问到并且已经被解决了很多次。

  • KeyListeners需要在聚焦组件上才能工作。一个解决方案是在首先使组件可聚焦之后,为其提供焦点。
  • 从长远来看,更好的方法是使用键绑定。谷歌这个教程。

请看一下我对这个问题的回答,了解更多关于这个问题的信息,包括许多血淋淋的细节。

 类似资料:
  • 问题内容: 由于某种原因,我的KeyListener只是不响应KeyPressed事件。 如果有关系,我使用的是Ubuntu 12.04。每当按下某个键时,它应该打印“ Key Pressed”,但不是这样。 这是代码: 问题答案: 致电(与您的问题无关,但稍后会解决一些问题) 使组件“具有焦点”- 使用键绑定过 使用过… 从Java文档 因为此方法的焦点行为取决于平台,所以强烈建议开发人员在可能

  • 问题内容: 我正在尝试制作一个游戏引擎。我已经制作了Game类,但错误仍在KeyBoard类中。在这里我留下一些代码。 类别::游戏 类::键盘 类别:: KeyTest 但是错误是没有抛出异常并且输入没有被读取。谁能说我这样做的正确方法。 问题答案: 简而言之,您的面板需要专注。在创建面板的任何地方添加: 这是一个SSCCE(我建议以后再问其中一个问题): 另外,https://www.goog

  • 问题内容: 嗨,我只是简单地尝试在www.example.com上获取h1标签,该标签显示为“ Example Domain”。该代码适用于http://www.example.com,但不适用于https://www.exmaple.com。我该如何解决这个问题?谢谢 问题答案: PhantomJSDriver不支持(所有)DesiredCapabilities。 你会需要: 记录在这里:htt

  • 所以我使用这种方法写入文件,它在windows上运行完全正常,但在mac上运行时,它会创建文件,但它们是空的。 我知道数据是正确的,因为它打印正确。感谢您的任何帮助,这真的让我绊倒了。

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

  • 列名称的类型为int[] 上述查询适用于postgresql,但不适用于hsqldb,甚至适用于sql 尝试的hsqldb版本:2.2.9和2.3.0 在hsqldb中工作的sql是从table_name中选择x,unnest(column_name)y(x)x和y不是该表的列。