【问题标题】:Java KeyAdapterJava 密钥适配器
【发布时间】:2009-10-27 20:54:12
【问题描述】:

我对 Java KeyAdapter 的工作原理有些陌生,并且使用 KeyAdapter 使用以下代码得到了意想不到的结果。无论是否调用了isKeyPressed(),当一个键按下而另一个键已被按住时,都会出现此问题。

注意:我知道这是很多代码,我深表歉意。我尽我所能隔离它,我认为它主要位于下面keyHandler 方法中的 cmets 周围(keyHandler() 如何将当前按下的键放入keysHeld)。希望彻底的 cmets 对您有所帮助。

keyHandler:

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 );
}

isKeyHeld:

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;
}

控制台输出:(按住leftArrow[37],然后按下rightArrow[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
...

【问题讨论】:

    标签: java keyevent


    【解决方案1】:

    几点:

    • 您不会使用KeyEvent 的实例填充keysHeld 数组,而是使用派生自int 键码的自动装箱Integer 对象。
    • 如果您想退出keyPressed 中的while 循环,您需要增加您的index 变量
    • 您不应该使用== 来比较您的while 循环中的两个Objects

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

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

    【讨论】:

    • 是的,递增索引做到了。一定是错过了。谢谢。
    【解决方案2】:

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

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

    【讨论】:

      猜你喜欢
      • 2013-09-01
      • 1970-01-01
      • 2012-06-18
      • 1970-01-01
      • 1970-01-01
      • 2015-08-13
      • 1970-01-01
      • 2020-03-18
      • 1970-01-01
      相关资源
      最近更新 更多