布尔人不同时工作

时间:2013-12-30 10:35:57

标签: java swing boolean output keylistener

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

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

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在给定时间可以容纳的内存量有关。

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

1 个答案:

答案 0 :(得分: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); }
}

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

你可以编辑它以总是显示密钥代码,这样你就可以立即看到生成了什么密钥代码。