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

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

严兴旺
2023-03-14

我正在做一个游戏,它需要键盘输入,很多时候你需要几个键同时按下。例如,你想按住空格来射击,向上箭头来推进,向左或向右箭头来转动。然而,箭头键的作用非常奇怪。大多数情况下,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

}


}

这里有几件事要用这个程序来说明我的意思:-保持空格,向上箭头,然后试着按向左或向右箭头。(程序只显示数组键,因为这就是奇怪的地方)--在中间有一点时间,按住空格、向上箭头和向右箭头,这样向上和向右箭头就会显示,然后当你把手指从右箭头上拿开时,按住左箭头。如果它不只是我的键盘,它将停留在右箭头被按下。

那么有人知道是什么导致了这一切吗?只是我的键盘吗?这真的是令人沮丧的尝试与游戏性方面的工作。

提前谢了。

共有1个答案

徐隐水
2023-03-14

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

 类似资料:
  • 问题内容: 如何检测何时按下箭头键之一?我用它来找出: 尽管它适用于所有其他键,但不适用于箭头键(可能是因为默认情况下浏览器应该在这些键上滚动)。 问题答案: 箭头键仅由触发,而不由触发。 关键代码为: left = 37 up = 38 right = 39 down = 40

  • 我试图模拟在rad grid控件(Telerik)的文本区域中按下左右箭头键。 我有一个特定于浏览器Firefox的错误,其中选项卡事件(修复了此部分)和箭头键将不起作用。所有其他浏览器工作正常。 因此,作为一种解决方法,我想使用JavaScript或jquery模拟箭头键。 下面是我使用包含的选项卡事件修复程序所做的工作。除此之外,我还检查按键代码37(这是左箭头键)是否被按下。此时,我想模拟文

  • 我有一个应用程序,它使用Camera2 API来预览相机。我想在手机的镜头之间进行选择。在我的代码中,我使用了以下代码: 当我使用我的galaxy s10时,它有2个前置摄像头(普通和宽)和3个后置摄像头,我只从经理那里得到4个ID: 为什么我没有3后置微距相机。 这些问题出现在我所有的手机上,手机背面有一个以上的摄像头 我怎样才能得到所有的后摄像头? TNX领先

  • 问题内容: 您能帮我重构此代码: 请同时说明如何检查上/下箭头键。谢谢! 问题答案:

  • 假设有几个以编程方式创建的按钮,并且有一个通用的按钮处理程序。 如何理解处理器内部哪个按钮被按下? 而不在函数调用中传递一些特殊的东西。那不行:< code > onButtonClicked(" button " I); 例如,在JavaScript中,在处理程序内部有< code>$(this),它可以立即“理解”按下了哪个按钮。 也许在颤振中也有类似的机制?我想在按钮上挂起属性(事先不知道哪

  • 如何在按钮中显示向上箭头符号?分别,我希望它在单击向下箭头时发生更改。我该怎么做?? 我试过了,但是。。。。