簡體   English   中英

Java KeyAdapter

[英]Java KeyAdapter

我有點不熟悉Java KeyAdapter工作方式,並且使用KeyAdapter使用以下代碼獲得了意外的結果。 不管是否isKeyPressed() ,在按下另一個鍵的同時按下一個鍵時,都會發生此問題。

注意:我知道這是很多代碼,對不起。 我盡力隔離了它,我認為它主要位於下面keyHandler方法中的注釋周圍( keyHandler()如何將當前按下的鍵放到keysHeld )。 希望詳盡的評論對您有所幫助。

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
...

幾點:

  • 您不會使用KeyEvent實例填充keysHeld數組,而是使用從int keyCodes派生的autoBoxed Integer對象。
  • 如果要退出keyPressedwhile循環,則需要增加index變量
  • 您不應該使用==來比較while循環中的兩個Objects

您可以使用以下內容進行測試:

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

處理多個鍵時,最好使用keyReleased(KeyEvent)方法:它使在釋放鍵期間更容易處理多個鍵組合。

我注意到的是,在keyPressed() ,我只能捕獲一個關鍵字符。 keyReleased ,我能夠捕獲多個字符(例如CTRL - V )。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM