我有点不熟悉Java如何 KeyAdapter 有效,并且使用以下代码得到了意想不到的结果 KeyAdapter. 。当一个键被按下而另一个键已经被按下时,就会出现这个问题,无论是否 isKeyPressed() 叫做。

笔记:我知道这是很多代码,对此我表示歉意。我尽了最大的努力来隔离它,我认为它主要存在于评论中 keyHandler 下面的方法(如何 keyHandler() 将当前按下的键放入 keysHeld)。希望详尽的评论对您有所帮助。

密钥处理程序:

ArrayList keysHeld = new ArrayList<KeyEvent>();

private void keyHandler()
{
    KeyAdapter keyListnr = new KeyAdapter()
    {
        public void keyPressed(KeyEvent e)
        { 
            int keyCode = e.getKeyCode();

            int index = 0;
            boolean found = false;
            while(!found && index<keysHeld.size()) //While not already found, and end of ArrayList not reached
            {
                System.out.print("errorCheck: keysHeld: "+keysHeld+", "+(Object)keyCode+" "); //PRINT
                if(keysHeld.get(index) == (Object)keyCode)
                {
                    System.out.println("found"); //PRINT
                    found = true; //This key is already recognized as held
                }
                else
                {
                    System.out.println("not found"); //PRINT
                    //This key is not recognized as held
                }
            }
            if(!found) //If key must be added to keysHeld
            {
                keysHeld.add(keyCode); //Add to list of held keys
            }
        System.out.println(keysHeld.toString()); //PRINT ArrayList of all held keys
    } //end of keyPressed


        public void keyReleased(KeyEvent e) //similar in concept to keyPressed
        {
         int keyCode = e.getKeyCode();

         int index = 0;
         boolean found = false;
         while(!found && index < keysHeld.size())
         {
          if(keysHeld.get(index) == (Object)keyCode)
          {
           keysHeld.remove(index); //remove key from keysHeld
           found = true;
          }
          else
          {
           index++;
          }
         }
         System.out.println(keysHeld.toString()); //PRINT ArrayList of all held keys
        } //end of keyReleased
    };
    addKeyListener( keyListnr );
}

是否持有钥匙:

public boolean isKeyHeld(int e)
{
 int keyCode = e;
 Object key = (Object)keyCode;

 if(!keysHeld.isEmpty())
 {
  int index = 0;
  while(index<keysHeld.size())
  {
   if(keysHeld.get(index) == key)
   {
    return true;
   }
   index++;
  }
 }
 return false;
}

控制台输出:(按住左箭头[37],然后按右箭头[39])

[37]
errorCheck: keysHeld: [37], 39 not found
errorCheck: keysHeld: [37], 39 not found
errorCheck: keysHeld: [37], 39 not found
errorCheck: keysHeld: [37], 39 not found
...
有帮助吗?

解决方案

几点:

  • 你没有填充你的 keysHeld 具有以下实例的数组 KeyEvent, ,但是使用 autoBoxed Integer 衍生自的对象 int 键码。
  • 你需要增加你的 index 如果你想退出变量 while 循环进入 keyPressed
  • 你不应该使用 == 比较两者 Objects 在你的 while 环形

您可以使用类似以下内容进行测试:

    if(keysHeld.get(index++).equals(new Integer(keyCode))

其他提示

处理多个键时,最好使用 keyReleased(KeyEvent)方法:它可以在键释放期间更轻松地处理多个键组合。

我注意到的是,当在 keyPressed()中时,我只能捕获一个关键字符。在 keyReleased 上,我能够捕获多个字符(例如 CTRL - V )。

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top