keytyped - Detectando y actuando sobre las teclas de dirección del teclado en Java
keypressed java enter (3)
Todos los días,
Tengo un proyecto de consola donde se pretende que el usuario presione las teclas de dirección del teclado (teclado 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.
¿Podría alguien ayudarme? Tus pensamientos o consejos son muy apreciados.
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.
Aquí están sus JavaDocs: http://java.sun.com/javase/6/docs/api/java/io/Console.html
Una vez que obtenga la consola (creo que desde System.console), puede obtener un lector y tal vez leer caracteres de él, pero no estoy seguro si incluye claves.
En general, se supone que debes usar Swing o AWT si quieres acceder al teclado, lo cual es una tontería.
A partir de 2007, hubo una solicitud de función al respecto: aquí
Lamentablemente, esto no es posible de forma 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 utilice un BufferedReader
. Las flechas recorrerán el historial de comandos. Inténtalo tú 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 al usar la clase de Console
(entrada almacenada bajo Windows, teclas de flecha interpretadas 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);
}
}
}
Si java.io.console no funciona para usted (no lo he intentado), pruebe con JLine . Lo usé para resolver un problema vagamente similar .