[英]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
對象。 keyPressed
的while
循環,則需要增加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.