【问题标题】:Booleans not working simultaneously布尔值不能同时工作
【发布时间】: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 在给定时间可以容纳的内存量有关。

虽然这对我没有真正的障碍,但很高兴知道这是如何发生的以及为什么会发生?

【问题讨论】:

标签: java swing boolean output keylistener


【解决方案1】:

我严重怀疑它与 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 或 Integers(对应于 KeyCodes)的 ArrayList 可能是更好的选择。

您可以将其编辑为始终也显示键码,这样您就可以立即看到生成的键码。

【讨论】:

  • +1 但如果没有 SSCCE,这个问题是无法回答的,按下释放是本机操作系统中用于键重复的标准设置,Java 仅使用此(本机操作系统)属性
  • 就像Queue 一样,我可以在其中堆叠项目并根据需要轮询它们?当我在其他地方筛选代码时,我已经看到它被使用过。我相信你走在正确的轨道上,我当然会把它作为答案,但是这个问题似乎更像是一个公开讨论......
  • -1 不管是什么问题,这都不能解决。这实际上只是对问题中代码的重构;除了默认情况下的错误消息,OP 可能无论如何都不想要。
  • @DavidWallace,优化代码、消除杂乱无章并包含调试消息通常是在代码中发现意外错误的第一步。如果没有更多调试信息,很难说实际上是什么问题。这是来自 12k rep 的非常令人惊讶的回应...
  • 这就是 cmets 的用途,而不是答案。答案是为了回答问题。评论是为了引出更多信息,以帮助回答问题。
猜你喜欢
  • 2020-08-09
  • 2013-04-09
  • 2017-12-05
  • 1970-01-01
  • 2016-07-11
  • 1970-01-01
  • 2022-12-10
  • 1970-01-01
  • 2017-02-28
相关资源
最近更新 更多