質問
Java KeyAdapter
がどのように機能するかに不慣れであり、 KeyAdapter
を使用した次のコードで予期しない結果が得られています。この問題は、 isKeyPressed()
が呼び出されるかどうかに関係なく、別のキーが既に押されているときにキーが押されると発生します。
注:これは大量のコードであることは知っていますが、申し訳ありません。私はそれを分離するために最善を尽くしましたが、それは主に以下の keyHandler
メソッドのコメントの周りにあると思います( keyHandler()
が現在押されているキーを< code> 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
...
解決
2つのポイント:
-
keyEvent
のインスタンスをkeysHeld
配列に設定するのではなく、int <から派生したautoBoxed
Integer
オブジェクトを使用します/ code> keyCodes。 -
keyPressed
の -
while
ループ内の2つのObjects
を比較するために==
を使用しないでください
while
ループから抜け出すには、 index
変数をインクリメントする必要があります
次のようなものでテストできます:
if(keysHeld.get(index++).equals(new Integer(keyCode))
他のヒント
複数のキーを処理する場合は、 keyReleased(KeyEvent)
メソッドを使用するのが最適です。キーを離すときに複数のキーの組み合わせを簡単に処理できます。
気づいたのは、 keyPressed()
内では、キーキャラクターを1つしかキャプチャできないということです。 keyReleased
で、複数の文字( CTRL - V など)をキャプチャできました。
所属していません StackOverflow