2009-02-21 17 views
8

Buenas, todo,Detectar y actuar sobre las teclas de dirección del teclado en Java

Tengo un proyecto de consola en la que se pretende que el usuario presiona las teclas de dirección del teclado (teclado no numérico) para mover un avatar. Tengo problemas para codificar para verificar si presiono estas teclas. En Pascal fue bastante fácil usar "readkey" y codificar, por ejemplo, para # 80 para presionar la tecla hacia abajo. Sin embargo, estoy perplejo sobre cómo implementar la misma funcionalidad en Java, aunque creo que entiendo el uso de System.in y BufferedInputStream.

¿Alguien podría ayudarme? Tus pensamientos o consejos son muy apreciados.

Respuesta

5

El problema de soporte de la consola en Java es bien conocido, no estoy seguro de que esto sea factible.

Esto inicialmente no era posible con System.in ya que solía funcionar en línea.

Sun finalmente agregó una clase java.io.Console.

Éstos son sus JavaDocs: http://java.sun.com/javase/6/docs/api/java/io/Console.html

Una vez que la consola (creo que desde System.Console), se puede obtener un lector y tal vez leer caracteres de ella, pero no estoy seguro de si se incluye llaves.

Generalmente, se supone que debes usar Swing o AWT si quieres acceder al teclado, lo cual es una tontería.

A partir de 2007, se produjo una de estas solicitudes al respecto: here

+0

Muchas gracias. Quizás regrese a Pascal o intente implementar mi proyecto en Swing. – elwynn

+0

Recomendaría Swing. – Eddie

+0

No regreses a Pascal. Java tiene muchos beneficios. Las aplicaciones de consola utilizan la consola principalmente para la entrada y salida basada en línea, no estaban pensadas para una interacción completa, era una aberración de DOS que todavía es compatible con Pascal. – Uri

6

Desafortunadamente esto no es posible de una manera portátil:

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

En Windows, la lectura de System.in bloqueará hasta que se presione enter, incluso cuando no use un BufferedReader. Las flechas recorrerán el historial de comandos. Inténtelo usted mismo:

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

mismo problema utilizando la clase Console (entrada en el buffer bajo Windows, teclas de flecha intepreted por 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 no funciona para usted (No lo he intentado), prueba JLine. Lo usé para resolver un vaguely similar problem.

+0

JLine es definitivamente el camino a seguir, ¡todavía ahora! – javanna

Cuestiones relacionadas