我正在开发一款需要键盘输入的游戏,很多时候你需要同时按下几个键。例如,您想要按住空格进行射击,向上箭头进行推进,向左或向右箭头进行转向。但是,箭头键的行为非常奇怪。大多数情况下,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/