2016-10-14 6 views
1

Ich habe ein Problem. Ich habe einige einfache Funktionen implementiert, die beim Drücken von Pfeilen aufgerufen werden.Nicht erkannt zwei Pfeile gedrückt - Java Swing

public void keyPressed(KeyEvent e) 
    { 
     int key = e.getKeyCode(); 
     if(key == KeyEvent.VK_LEFT) 
     { 

      double t = p.getAngle(); 
      if(p.getIsTurning()) 
       t+=3; 
      else 
       t+=6; 
      p.setAngle(t); 
      p.setIsTurinig(true); 

     } 
     else if(key == KeyEvent.VK_UP) 
     { 
      p.setVelX(p.getVelX()+p.getAcceleration()); 
      p.setIsAccelerating(true); 
     }  
} 

Wenn ich Pfeil nach oben und dann nach links drücke, funktioniert alles gut. Wenn ich jedoch den linken Pfeil und dann den Pfeil nach oben drücke, wird nur die Funktion Pfeil nach oben erkannt.

Was könnte das Problem verursachen?

+0

Natürlich wäre der erste else wenn sollte – chodi

+2

Dann sollten Sie Ihren Code bearbeiten, um dies anzuzeigen. – DevilsHnd

+1

Verwenden Sie keinen KeyListener. Sie sollten 'Key Bindings' verwenden, um bestimmte Ereignisse zu behandeln. Weitere Informationen und Arbeitsbeispiele, die mit mehreren gleichzeitig gedrückten Tasten funktionieren, finden Sie unter [Bewegung mit der Tastatur](). – camickr

Antwort

1

Weder , wenn wird wirklich erkennen, dass sowohl die linke und die Pfeiltaste nach oben gleichzeitig gedrückt werden. Das Ereignis gibt nur die letzte-Taste zurück. Selbst wenn Sie den Pfeil nach oben und dann nach links drücken, erkennen Sie nur die linke Pfeiltaste. Sie könnten sehr gut die DOWN und LINKS Pfeiltasten gedrückt haben und der gleiche IF Zustand würde auslösen.

Eine Möglichkeit, zu erkennen, ob oder ob nicht mehr Tasten gleichzeitig gedrückt werden, ist boolean Fahnen zu erstellen, um anzuzeigen, welche Tasten gewünschte gedrückt werden und welche nicht, aber Sie müssen auch die keyReleased Ereignis nutzen, um die notwendigen zu fälschen Flags, wenn ein bestimmter Schlüssel freigegeben wird. Die Booleschen Flags sollten auf Ihre Tastaturereignisse global sein, zum Beispiel:

boolean keyOne = false; // flag for LEFT Arrow key 
boolean keyTwo = false; // flag for UP Arrow key 

public void keyPressed(KeyEvent e) { 
    int key = e.getKeyCode(); 
    if(key == KeyEvent.VK_LEFT) { keyOne = true; } 
    else if(key == KeyEvent.VK_UP) { keyTwo = true; } 

    if (keyOne && !keyTwo) { 
     System.out.println("Only the LEFT Arrow key is pressed!"); 
    } 
    else if (!keyOne && keyTwo) { 
     System.out.println("Only the UP Arrow key is pressed!"); 
    } 
    else if (keyOne && keyTwo) { 
     System.out.println("Both LEFT Arrow and UP Arrow keys are pressed!); 
    } 
} 

public void keyReleaseded(KeyEvent e) { 
    int key = e.getKeyCode(); 
    if(key == KeyEvent.VK_LEFT) { keyOne = false; } 
    else if(key == KeyEvent.VK_UP) { keyTwo = false; } 
} 

Wenigstens etwas in diesem Sinne ...

Platz gewünschten Code in den (Keyone & & keyTwo) wenn Zustand .