Frage
Ich bin etwas ungewohnt mit, wie der Java KeyAdapter
funktioniert, und bin immer unerwartete Ergebnisse mit dem folgenden Code KeyAdapter
. Das Problem tritt auf, wenn eine Taste gedrückt wird, während ein anderer Schlüssel bereits nach unten gehalten wird, unabhängig davon, ob isKeyPressed()
genannt wird.
Hinweis: Ich weiß, dass dies eine Menge Code ist, und ich entschuldige mich. Ich habe versucht, das Beste, was ich es isolieren kann, und ich denke, dass es in erster Linie um die Kommentare in dem keyHandler
Verfahren liegt unten (wie keyHandler()
die Tasten setzt zur Zeit in keysHeld
gedrückt). Hoffentlich werden die eingehenden Kommentare sind hilfreich.
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;
}
Konsolenausgang: (gehalten LEFTARROW [37] und dann gedrückt 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
...
Lösung
Ein paar Punkte:
- Sie bevölkern nicht Ihre
keysHeld
Array mit Instanzen vonKeyEvent
, aber mit autoBoxedInteger
Objekte aus denint
keycodes abgeleitet. - Sie benötigen
index
Variable zu erhöhen, wenn Sie aus demwhile
Schleife inkeyPressed
erhalten möchten - Sie sollten nicht
==
verwenden, um die zweiObjects
in Ihrerwhile
Schleife vergleichen
Sie können mit so etwas wie die folgenden Test:
if(keysHeld.get(index++).equals(new Integer(keyCode))
Andere Tipps
Wenn mehrere Tasten Handhabung, ist es am besten, die keyReleased(KeyEvent)
Methode zu verwenden. Es macht es einfacher, mehrere Tastenkombinationen während einer Schlüsselhilfsentriegelung zu behandeln
Was habe ich bemerkt, war, dass, wenn im Inneren des keyPressed()
, würde ich nur einen Schlüssel Charakter zu erfassen. Auf einem keyReleased
konnte ich mehrere Zeichen (wie STRG - V ) erfassen.