Java KeyListener 未检测到所有按下的箭头键

标签 java keyboard keylistener

我正在开发一款需要键盘输入的游戏,很多时候你需要同时按下几个键。例如,您想要按住空格进行射击,向上箭头进行推进,向左或向右箭头进行转向。但是,箭头键的行为非常奇怪。大多数情况下,keypressed 方法不会识别出第三个箭头键被按下,有时甚至更奇怪:如果按住其他键,它会检测到错误的键。我知道这很令人困惑,所以我制作了一个程序来展示它:

package resources;
import java.awt.*;
import java.awt.event.*;
import java.util.*;
import javax.swing.*;
import javax.swing.Timer;

public class Keys extends JPanel implements ActionListener, KeyListener {

Timer t = new Timer(5, this);
ArrayList<String> keyspressed;

public Keys() {
    JFrame f = new JFrame();
    f.setSize(350, 100);
    addKeyListener(this);
    setFocusable(true);
    setFocusTraversalKeysEnabled(false);
    f.add(this);
    f.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
    f.setVisible(true);
    t.start();

    keyspressed = new ArrayList<String>();
}

public void actionPerformed(ActionEvent e) {
    repaint(); System.out.println(keyspressed);
}

public void paintComponent(Graphics g) {
    super.paintComponent(g);
    g.drawString(showKeysPressed(), 20, 20);
}

public String showKeysPressed() {
    String s = "Currently pressed keys: ";
    for(int i = 0; i < keyspressed.size(); i++) {
        s+= keyspressed.get(i) + "   ";
    }
    return s;
}

public void keyPressed(KeyEvent e) {
    if(e.getKeyCode() == KeyEvent.VK_UP && !keyspressed.contains("Up"))
        keyspressed.add("Up");
    if(e.getKeyCode() == KeyEvent.VK_RIGHT && !keyspressed.contains("Right"))
        keyspressed.add("Right");
    if(e.getKeyCode() == KeyEvent.VK_LEFT && !keyspressed.contains("Left"))
        keyspressed.add("Left");
    if(e.getKeyCode() == KeyEvent.VK_DOWN && !keyspressed.contains("Down"))
        keyspressed.add("Down");

}

public void keyReleased(KeyEvent e) {
    if(e.getKeyCode() == KeyEvent.VK_UP)
        keyspressed.remove("Up");
    if(e.getKeyCode() == KeyEvent.VK_RIGHT)
        keyspressed.remove("Right");
    if(e.getKeyCode() == KeyEvent.VK_LEFT)
        keyspressed.remove("Left");
    if(e.getKeyCode() == KeyEvent.VK_DOWN)
        keyspressed.remove("Down");

}

public static void main(String[] args) {
    new Keys();
}





@Override
public void keyTyped(KeyEvent arg0) {
    // TODO Auto-generated method stub

}


}

为了说明我的意思,这里有一些与该程序有关的事情: - 按住空格、向上箭头,然后尝试按向左或向右箭头。 (该程序只显示数组键,因为这很奇怪) - 稍等片刻,按住空格键、向上箭头和向右箭头,这样就会显示向上和向右,然后当您将手指从向右箭头上移开时,按住向左箭头。如果不只是我的键盘,它将保持按下向右箭头的状态。

有谁知道是什么原因造成的吗?这只是我的键盘吗?尝试在游戏玩法方面进行工作真的很令人沮丧。

提前致谢。

最佳答案

改用这些库 http://ksquared.de/blog/releases/stable/keyboard_hook-0.3.zip 这些具有正确的箭头键映射并且可以有效地检测多个按键,尽管 JNativeHook远比这个好。

关于Java KeyListener 未检测到所有按下的箭头键,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/28891867/

相关文章:

java - 使用 Java 在 Eclipse 中创建扫描仪时出现 FileNotFoundException

swift - 在运行时更改 Swift 中文本字段的键盘类型

c# - 在 WPF 中处理 Key 的正确且独立于文化的方法是什么?

java - 为什么我的 Java 程序不会使用 KeyListener 确认任何击键?

Java线程的创建和执行

java - Spring Boot中的生产级别异常处理

java - MimeMessage 电子邮件不会发送附件

ios - 如何获取 iPhone 和 iPad 中纵向和横向的键盘高度

java - 添加自定义方法作为组件的关键监听器

java - 在 Java 中使用键盘 "ContextMenu"按钮