首页 文章

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

提问于
浏览 627
4

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

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 回答

相关问题