2013-08-03 12 views
16

In Java habe ich ein Programm, das kontinuierlich überprüfen muss, ob ein Benutzer eine Taste drückt. So In psuedocode, somthing wieWie überprüfe ich, ob der Benutzer eine Taste drückt?

if (isPressing("w")) 
{ 
//do somthing 
} 

Vielen Dank im Voraus!

+0

Mögliche Duplikat http://stackoverflow.com/questions/616924/how-to-check-if-the-key-pressed-was-an-arrow- key-in-java-keylistener – woofmeow

+0

In Java, aber mit einem bestimmten GUI-Framework (Swing?)? – mael

Antwort

32

in Java Sie überprüfen nicht, ob eine Taste gedrückt ist, können Sie stattdessen hören bis KeyEvent s. Der richtige Weg, um Ihr Ziel zu erreichen, ist eine KeyEventDispatcher, registrieren und implementieren sie den Zustand des gewünschten Schlüssel zu erhalten:

import java.awt.KeyEventDispatcher; 
import java.awt.KeyboardFocusManager; 
import java.awt.event.KeyEvent; 

public class IsKeyPressed { 
    private static volatile boolean wPressed = false; 
    public static boolean isWPressed() { 
     synchronized (IsKeyPressed.class) { 
      return wPressed; 
     } 
    } 

    public static void main(String[] args) { 
     KeyboardFocusManager.getCurrentKeyboardFocusManager().addKeyEventDispatcher(new KeyEventDispatcher() { 

      @Override 
      public boolean dispatchKeyEvent(KeyEvent ke) { 
       synchronized (IsKeyPressed.class) { 
        switch (ke.getID()) { 
        case KeyEvent.KEY_PRESSED: 
         if (ke.getKeyCode() == KeyEvent.VK_W) { 
          wPressed = true; 
         } 
         break; 

        case KeyEvent.KEY_RELEASED: 
         if (ke.getKeyCode() == KeyEvent.VK_W) { 
          wPressed = false; 
         } 
         break; 
        } 
        return false; 
       } 
      } 
     }); 
    } 
} 

Dann können Sie immer wie folgt:

if (IsKeyPressed.isWPressed()) { 
    // do your thing. 
} 

Sie können, von Natürlich, verwenden Sie die gleiche Methode, um isPressing("<some key>") mit einer Karte von Schlüsseln und ihren Zustand innerhalb IsKeyPressed gewickelt zu implementieren.

+0

Danke das ist perfekt! – Saucymeatman

+0

Dies wird nicht kompilieren, es sagt "Kann nicht verwenden IsKeyPressed.this im statischen Kontext" – Saucymeatman

+1

Sorry, ich habe meinen Code aktualisiert, ohne es zu überprüfen. Siehe meine aktualisierte Antwort - es verwendet das Klassenobjekt anstelle der Instanz. Probieren Sie es erneut (ersetzen Sie einfach "IsKeyPressed.this" durch "IsKeyPressed.class"). Der "synchronisierte" Block ist übrigens in diesem Fall nicht wirklich notwendig. – Elist

1

hoffen, dass es funktioniert:

import java.awt.event.KeyAdapter; 
    import java.awt.event.KeyEvent; 
    import javax.swing.JFrame; 
    import javax.swing.JTextField; 

    public class Main { 

     public static void main(String[] argv) throws Exception { 

     JTextField textField = new JTextField(); 

     textField.addKeyListener(new Keychecker()); 

     JFrame jframe = new JFrame(); 

     jframe.add(textField); 

     jframe.setSize(400, 350); 

     jframe.setVisible(true); 

     } 
    } 

    class Keychecker extends KeyAdapter { 

     @Override 
     public void keyPressed(KeyEvent event) { 

     char ch = event.getKeyChar(); 

     System.out.println(event.getKeyChar()); 




     } 
     } 
    } 
Verwandte Themen