Détection et action sur les touches de direction du clavier en Java

g'day tous,

j'ai un projet de console où il est prévu que l'utilisateur appuie sur les touches de direction du clavier (clavier non numérique) pour déplacer un avatar. J'ai du mal à coder pour vérifier la pression de ces touches. En Pascal, il était assez facile d'utiliser "readkey" et le code, par exemple, pour le #80 pour la touche down. Cependant, je suis stumped comment mettre en œuvre la même fonctionnalité en Java, bien que je pense que je comprends l'utilisation du système.in et BufferedInputStream.

Quelqu'un peut-il m'aider? Votre avis ou conseils sont appréciés.

9
demandé sur elwynn 2009-02-21 05:42:19

4 réponses

le problème du support de la Console en Java est bien connu, Je ne suis pas sûr que ce soit faisable.

cela n'a pas été possible au départ avec le système.depuis qu'il a l'habitude de travailler par ligne.

Sun finit par ajouter un java.io.Classe Console.

voici ses JavaDocs: http://java.sun.com/javase/6/docs/api/java/io/Console.html

une fois que vous obtenez la console (je pense du système.console), vous pouvez obtenir un lecteur et peut-être lire des caractères, mais je ne sais pas si elle comprend des touches.

généralement, vous êtes censé utiliser Swing ou AWT si vous voulez accéder au clavier, ce qui est stupide.

en 2007, il y avait une demande de caractéristique à ce sujet: ici

4
répondu Uri 2009-02-21 02:50:22

malheureusement ce n'est pas possible d'une manière portable:

http://forums.sun.com/thread.jspa?threadID=5351637&messageID=10526512

sous Windows, lecture du système.dans va bloquer jusqu'à ce que enter est pressé, même si vous n'utilisez pas un BufferedReader . Les flèches parcourront l'historique des commandes. Essayez vous-même:

import java.io.*;
public class KeyTest {
  public static void main(String[] argv) {
    try {
      InputStreamReader unbuffered = new InputStreamReader(System.in);
      for (int i = 0; i < 10; ++i) {
        int x = unbuffered.read();
        System.out.println(String.format("%08x", x));
      }
    } catch (Exception e) {
      System.err.println(e);
    }
  }
}

même question utilisant la classe Console (entrée tampon sous Windows, les touches fléchées intepreted par Windows):

import java.io.*;
public class KeyTest2 {
  public static void main(String[] argv) {
    try {
      Console cons = System.console();
      if (cons != null) {
        Reader unbuffered = cons.reader();
        for (int i = 0; i < 10; ++i ) {
          int x = unbuffered.read();
          System.out.println(String.format("%08x", x));
        }
      }
    } catch (Exception e) {
      System.err.println(e);
    }
  }
}
5
répondu vladr 2009-02-21 02:57:39

si java.io.console ne fonctionne pas pour vous (je n'ai pas essayé cela), essayez JLine . Je l'ai utilisé pour résoudre un problème vaguement similaire .

5
répondu Jason S 2017-05-23 10:32:50

Pas avec construit-dans du code Java. Découvrez java malédictions bibliothèques ou JLine comme mentionné ci-dessus, si vous voulez continuer.

0
répondu Barett 2018-07-24 01:53:53