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

Java KeyRelease工作正常,但keyPressed失控

东方华荣
2023-03-14
@Override
public void keyPressed(KeyEvent e) {
    //When keyPressed lost control, this line did not even work
    System.out.println("key pressed");
    if(e.getKeyCode() == KeyEvent.VK_A){
        left = true;
    }
    else if(e.getKeyCode() == KeyEvent.VK_D){
        right = true;
    }
    else if(e.getKeyCode() == KeyEvent.VK_SPACE){
        jump();
    }
    else if(e.getKeyCode() == KeyEvent.VK_LEFT){
        attackLeft = true;
    }
    else if(e.getKeyCode() == KeyEvent.VK_RIGHT){
        attackRight = true;
    }
    else if(e.getKeyCode() == KeyEvent.VK_R) init();
    else if(e.getKeyCode() == KeyEvent.VK_Q) System.exit(0);
}
@Override
public void keyReleased(KeyEvent e) {
    //This line will output the message every time I released even
    //if keyPressed did not work.
    System.out.println("Key released");
    if(e.getKeyCode() == KeyEvent.VK_A) left = false;
    else if(e.getKeyCode() == KeyEvent.VK_D) right = false;
    else if(e.getKeyCode() == KeyEvent.VK_LEFT) attackLeft = false;
    else if(e.getKeyCode() == KeyEvent.VK_RIGHT) attackRight = false;
}

按下键时的示例输出不起作用:

Key pressed
Key released
Key pressed
Key released
Key released
Key released
Key released
Key released
Key released
Key released
Key released
Key released

共有1个答案

岑毅庵
2023-03-14

您可能更喜欢从Canvas切换到JPanel,并正确使用getActionMap().put(...)和getInputMap().put(...)(并重写PaintComponent方法)

你也应该看看这里

一个简单的例子可能如下所示

public class Example2 extends JPanel {

    public Example2() {
        super(new BorderLayout());

        JPanel canvas = new JPanel();

        Action action = new AbstractAction() {
            public void actionPerformed(ActionEvent e) {
                System.out.println(e.getActionCommand());
            }
        };

        InputMap im = canvas.getInputMap(JComponent.WHEN_IN_FOCUSED_WINDOW);

        im.put(KeyStroke.getKeyStroke('w'), "wasd");
        im.put(KeyStroke.getKeyStroke('a'), "wasd");
        im.put(KeyStroke.getKeyStroke('s'), "wasd");
        im.put(KeyStroke.getKeyStroke('d'), "wasd");

        canvas.getActionMap().put("wasd", action);

        add(canvas, BorderLayout.CENTER);

    }

    private static void createAndShowGUI() {
        JFrame frame = new JFrame();
        frame.setContentPane(new Example2());
        frame.setSize(200, 200);
        frame.setVisible(true);
    }

    public static void main(String[] args) {
        javax.swing.SwingUtilities.invokeLater(new Runnable() {
            public void run() {
                createAndShowGUI();
            }
        });
    }

}
 类似资料:
  • 问题内容: 我在主软件包的一个目录下有一些文件: main.go config.go server.go 当我这样做时:“执行构建”程序将完美构建并运行良好。当我这样做时:“ go run main.go”失败了。 输出: 未定义的符号是结构,并且大写,因此应将其导出。 我的Go版本:go1.1.2 linux / amd64 问题答案: 这应该工作 Go run需要一个文件或多个文件,并且它仅合

  • 我已经查看了所有关于CORS错误的其他问题,但运气不好。我正在NuxtJS客户端应用程序中发出一个简单的POST请求。如果我使用axios,我会得到CORS错误,但如果我使用fetch,它工作得很好。我想使用axios,但我无法解决这个问题。服务器设置了正确的“Access Control Allow Origin”标头(删除该标头时,以下两个选项都不起作用)。有人知道为什么fetch可以工作,但

  • 我在OSX上使用react-native 0.43.3。我试着在Android上运行应用程序并获取消息 ./gradlew installDebug给了我一些错误,并将其全部修复。最后,构建获得成功,应用程序正在Android设备上运行。 但是命令仍然不起作用。只有命令起作用。 使用命令时有什么可以检查的吗? 我不明白它怎么会发生。

  • 我是Spring云和Spring后端开发的新手。我正在尝试用SpringCloudGateway开发一个简单的微服务。 Github链接到Discovery Server、Spring Cloud Api网关和用户微服务。令人惊讶的是,当我在Postman中执行API时,GET API起作用,但POST却不起作用。 我试着调试,但它并没有传到我的控制器上。我错过了什么?还是做错了?任何帮助或建议都

  • 我有一个程序,用来接受用户的图像。我改为接受PDF文件,而不是我们的客户要求的问题是它不工作。 我已经换了哑剧。php配置到这个 这是我保存上传文件的CI代码 HTML 滑动分页 编辑:jquery报告该文件已成功上载,因为它返回JSON,但每当我检查目录时,都没有任何内容。奇怪的是,我将文件扩展名重命名为。TXT并上传了一个3.5MB的pdf文件。txt扩展名,它已成功上载并位于正确的目录中。

  • Log4j正在查找我的配置,因为一旦我删除它,我就会收到一条错误消息,说它找不到配置,但是它的属性在登录时不会反映出来。 log4j2。属性: Test.java: 输出: 如您所见,当记录器设置为INFO时,它将返回级别为ERROR,并且时间格式包括毫秒,即使它已被删除。 配置文件取自log4j网站,只做了一些小改动(上面提到的两个,以及) 我使用的是2.8.1版。