布尔人不同时工作

The*_*nny 0 java swing boolean keylistener output

我一直在创建一个测试程序来测试角度上的移动是如何工作的,即使这不是我的问题所在,也是我的问题/困惑所在的程序.这个错误(?)不会影响我的程序的工作方式,除非用户想要键入每个键的混搭,看看会发生什么,这正是我做的...

我有一个关键的监听器,在每个按键和键释放时,在数组中设置一个布尔值:

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);
  }
}
Run Code Online (Sandbox Code Playgroud)

我的面板画了哪些按键被按下了,我注意到并非我按下的所有按键都被画到屏幕上.我很困惑,认为它与缓冲图像太小有关,所以我仔细检查了一下,奇怪的是它没有.我决定将阵列中的所有布尔值打印到控制台,我发现,实际上,某些键实际上并没有在物理上被按下.

以下是我在按下不同键时收到的一些输出:

// 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
Run Code Online (Sandbox Code Playgroud)

我不确定为什么会这样,但我感觉它与JVM在给定时间可以容纳的内存量有关.

虽然这对我来说没有任何障碍,但知道这种情况发生的原因和原因会很好吗?

jed*_*rds 5

我严重怀疑它与JVM在给定时间可以容纳的内存量有什么关系.

很难说最好的方法是做你想做的事.

考虑类似的事情:

public void keyPressed(KeyEvent e) {
  int key = e.getKeyCode();  
  int keyIndex = -1;

  switch(key)
  {
    case KeyEvent.VK_LEFT:  keyIndex = 0; break;
    case KeyEvent.VK_UP:    keyIndex = 1; break;
    case KeyEvent.VK_RIGHT: keyIndex = 2; break;
    case KeyEvent.VK_DOWN:  keyIndex = 3; break;
    case KeyEvent.VK_G:     keyIndex = 4; break;
    case KeyEvent.VK_H:     keyIndex = 5; break;
    default:
      System.out.format("Unexpected KeyCode [%d]\n", key);
      break;
  }

  if(keyIndex != -1){ player.setKeyValue(keyIndex, true); }
}
Run Code Online (Sandbox Code Playgroud)

这种方法摆脱了很多困难,并且如果你得到意想不到的钥匙,也会尝试通知你.不知道更多,很难给你一个更好的答案,但我提出的那个肯定不是最好的 - 它只是调试的一个步骤.我的猜测类似于KeyEvents或整数(对应于KeyCodes)的ArrayList可能是更好的选择.

您可以编辑它以始终显示密钥代码,这样您就可以立即看到生成的密钥代码.

  • @DavidWallace,优化代码,消除错误以及包含调试消息通常是在代码中发现错误的第一步.没有更多的调试信息,很难说实际上是什么问题*.这是12k代表的一个非常令人惊讶的回应...... (8认同)