2009-10-27 22 views
0

我對Java KeyAdapter的工作原理有些陌生,並且使用KeyAdapter以下代碼獲得意外結果。無論是否調用isKeyPressed(),在按住某個鍵的同時又按下了另一個鍵時會出現問題。Java KeyAdapter

注:我知道這是很多代碼,我很抱歉。我盡我所能去隔離它,我認爲它主要圍繞着下面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],然後按下向右鍵[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 
... 

回答

1

幾個點:

  • 您未在keysHeld陣列中填充KeyEvent的實例,而是使用從int keyCodes派生的autoBoxed Integer對象。
  • 你需要的,如果你想擺脫while循環的keyPressed
  • 你不應該使用==比較來增加您的index變量兩個Objectswhile循環

你可以像測試以下:

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

是的,遞增指數做到了。一定錯過了它。謝謝。 – Jonathan 2009-10-27 21:25:17

0

當處理多個鍵,最好使用keyReleased(KeyEvent)方法:它使得在密鑰發佈期間更容易處理多個密鑰組合。

我注意到,當在keyPressed()裏面時,我只能捕捉到一個關鍵字符。在keyReleased上,我能夠捕獲多個字符(例如CTRL - V)。