2016-10-14 2 views
1

У меня проблема. Я реализовал несколько простых функций, которые вызывается при нажатии стрелок.Не обнаружено две стрелки нажатой - 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); 
     }  
} 

Когда я нажимаю стрелку, а затем влево, все работает хорошо. Однако, когда я нажимаю стрелку влево, а затем стрелку вверх, тогда обнаруживается только функция стрелки вверх.

Что может вызвать проблему?

+0

Конечно, первое, если должно быть, если – chodi

+2

Тогда вы должны отредактировать свой код, чтобы указать это. – DevilsHnd

+1

Не используйте KeyListener. Вы должны использовать 'Key Bindings' для обработки определенных событий. Проверьте [Motion Using the Keyboard]() для получения дополнительной информации и рабочих примеров, которые работают одновременно с несколькими нажатиями клавиш. – camickr

ответ

1

Ни , если действительно обнаружит, что одновременно нажаты клавиши со стрелками влево и вправо. Событие вернет только последним нажатой клавишей. Даже когда вы нажимаете стрелку ВВЕРХ, а затем клавиши со стрелками влево, все, что вы действительно обнаруживаете, - это стрелка влево. Вы вполне могли бы нажать клавиши со стрелками ВНИЗ и ВЛЕВО и то же самое, что и состояние IF.

Один из способов обнаружить ли не несколько клавиш нажаты одновременно является созданием логических флагов указать, какие нужные клавиши нажимаются и которые не являются, но вы также должны использовать KeyReleased события так, чтобы фальсифицировать необходимые флаги при отпускании определенного ключа. Булевы флаги должны быть глобальными для вашей клавиатуры событий, например:

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; } 
} 

По крайней мере, то, что эффект ...

Поместите нужный код в (keyOne & & keyTwo) если условие ,

Смежные вопросы