【发布时间】:2015-05-07 15:35:30
【问题描述】:
我正在开发一款需要键盘输入的游戏,而且很多时候您需要同时按下多个键。例如,您希望按住空格进行射击,向上箭头进行推力,以及向左或向右箭头进行转身。但是,箭头键的作用非常奇怪。大多数情况下,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
}
}
以下是与该程序有关的一些事情,以说明我的意思: - 按住空格,向上箭头,然后尝试按向左或向右箭头。 (该程序仅显示数组键,因为这很奇怪) - 中间有一点时间,按住空格键、向上箭头和向右箭头,以便显示向上和向右,然后当您将手指从向右箭头上移开时,按住向左箭头。如果它不只是我的键盘,它将保持按下右箭头。
那么有人知道是什么原因造成的吗?只是我的键盘吗?尝试在游戏方面进行工作真是令人沮丧。
提前致谢。
【问题讨论】:
-
请注意,某些键盘对您可以同时按下的键数有限制。 :) 对于一些较旧的键盘,甚至是低质量的现代键盘,限制是一次两个键。解决此问题的唯一方法是购买更好的键盘。您的键盘上也有“键组”,因此当您尝试一次按太多属于该组的键时,某些键组可能会出现问题。我不确定这是否会导致您的问题,但我只是想让您意识到这一点。
-
感谢您的回复。您是否快速尝试了该程序?我很好奇其他人是否会遇到奇怪的事情,即如果我同时切换它会检测到错误的箭头键。我也可以同时按两个以上的字母,只是不能按箭头键。但也许只是我键盘上的箭头键是这样的?
-
我可以同时按下所有 4 个箭头:prntscr.com/6d9usa
-
到目前为止我可以得到 5 个...
-
这是一个 Web 应用程序(无需下载),您可以使用有用的 GUI 来测试您的键盘输入:microsoft.com/appliedsciences/antighostingexplained.mspx
标签: java keyboard keylistener