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
...
War es hilfreich?

Lösung

Ein paar Punkte:

  • Sie bevölkern nicht Ihre keysHeld Array mit Instanzen von KeyEvent, aber mit autoBoxed Integer Objekte aus den int keycodes abgeleitet.
  • Sie benötigen index Variable zu erhöhen, wenn Sie aus dem while Schleife in keyPressed erhalten möchten
  • Sie sollten nicht == verwenden, um die zwei Objects in Ihrer while 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.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top