【发布时间】:2014-01-17 05:38:31
【问题描述】:
我一直在创建一个测试程序来测试一个角度上的移动可能如何工作,即使这不是我的问题所在,它是我的问题/困惑所在的程序。这个错误(?)不会影响我的程序的工作方式,除非用户想要键入每个键以查看会发生什么,而这正是我所做的......
我有一个按键监听器,在每次按键和按键释放时,都会在数组中设置一个布尔值:
public void keyPressed(KeyEvent e) {
int key = e.getKeyCode();
int a = KeyEvent.VK_LEFT; // int value of 37
int b = KeyEvent.VK_UP; // 38
int c = KeyEvent.VK_RIGHT; // 39
int d = KeyEvent.VK_DOWN; // 40
int aa = KeyEvent.VK_G; // 71
int bb = KeyEvent.VK_H; // 72
if(key == a || key == b || key == c || key == d) {
player.setKeyValue(key - 37, true); // keyReleased is exactly the same but with a false
}
if(key == aa || key == bb) {
player.setKeyValue((key - 71) + 4, true);
}
}
我让我的面板绘制了哪些键被按下,我注意到并非我按下的所有键都被绘制到屏幕上。我很困惑,认为这与缓冲图像太小有关,所以我仔细检查了一下,奇怪的是它不是。我决定将数组中的所有布尔值都打印到控制台,我发现确实有些键在物理上没有被按下。
这是我在同时按下不同键时收到的一些输出:
// booleans are in order: Left, up, right, down, g, h
true, false, true, false, false, true
true, false, true, false, true, true
true, false, true, false, false, false
我不确定为什么会发生这种情况,但我感觉这与 JVM 在给定时间可以容纳的内存量有关。
虽然这对我没有真正的障碍,但很高兴知道这是如何发生的以及为什么会发生?
【问题讨论】:
-
我不确定我是否理解正确,但如果您实际上一次按下多个键,那么您应该知道使用“正常”键盘硬件检测单个按键按下/释放存在限制。请参阅 en.wikipedia.org/wiki/… 和 en.wikipedia.org/wiki/Rollover_%28key%29。也可以想象,键盘、键盘驱动、操作系统(windowsnetworking.com/kbase/WindowsTips/WindowsNT/RegistryTips/…)等中至少有一个很小的缓冲区溢出。
-
正确,我正在尝试同时按所有/多个键。所以我稍微正确的是它与 JVM 内存有关?还是溢出了不同的东西? - 我喜欢这个网站。我可以搜索任何东西的答案。 :D
标签: java swing boolean output keylistener