2009-02-21 9 views
8

G'day tout,La détection et d'agir sur les touches de direction du clavier en Java

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 # 80 pour la touche down. Cependant, je suis perplexe comment implémenter la même fonctionnalité dans Java, bien que je pense que je comprends l'utilisation de System.in et BufferedInputStream.

Quelqu'un peut-il m'aider? Vos pensées ou conseils sont très appréciés.

Répondre

5

Le problème de support de console dans Java est bien connu, je ne suis pas sûr que ce soit faisable.

Initialement, cela n'était pas possible avec System.in car il travaillait avec des lignes.

Sun a finalement ajouté une classe java.io.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 à partir System.Console), vous pouvez obtenir un lecteur et peut-être lire les caractères de lui, mais je ne suis pas sûr si elle comprend clés.

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 fonctionnalité à son sujet: here

+0

Merci beaucoup. Je pourrais alors revenir à Pascal, ou essayer et implémenter mon projet dans Swing. – elwynn

+0

Je recommanderais Swing. – Eddie

+0

Ne revenez pas à Pascal. Java a de nombreux avantages. Les applications de console utilisent principalement la console pour la sortie et l'entrée par ligne, elles n'étaient pas destinées à une interaction complète, c'était une aberration de DOS qui est toujours supportée par Pascal. – Uri

6

Malheureusement, ce n'est pas possible de manière portable:

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

Sous Windows, la lecture de System.in bloquera jusqu'à ce que vous appuyiez sur enter, même si vous n'utilisez pas 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 problème en utilisant la Console classe (entrée en mémoire 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); 
    } 
    } 
} 
4

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 vaguely similar problem.

+0

JLine est définitivement la voie à suivre, encore maintenant! – javanna

Questions connexes