Detectar e agir sobre as teclas de direção do teclado em Java
Pergunta
G'day todos,
Eu tenho um projeto de console onde se pretende que o usuário pressiona as teclas de direção do teclado (teclado não-numérico) para mover um avatar. Estou tendo dificuldade de codificação para verificar a imprensa destas chaves. Em Pascal era bastante fácil de usar "ReadKey" e código, por exemplo, para # 80 para o keypress para baixo. No entanto, eu estou perplexo como implementar a mesma funcionalidade em Java, embora eu acho que entendo o uso de System.in e BufferedInputStream.
Alguém poderia me ajudar? Seus pensamentos ou sugestões são muito apreciados.
Solução
O problema de suporte Console em Java é bem conhecido, não estou certo de que isso é factível.
Este não era inicialmente possível com System.in vez que costumava baseado em linha de trabalho.
Sun, eventualmente adicionado uma classe java.io.Console.
Aqui estão seus JavaDocs: http://java.sun.com/javase/ 6 / docs / api / java / io / Console.html
Depois de conseguir o console (I pensar a partir System.Console), você pode obter um leitor e os personagens talvez ler a partir dele, mas eu não tenho certeza se ele inclui chaves.
Geralmente, você deveria usar Swing ou AWT se você quiser acesso ao teclado, que é bobagem.
A partir de 2007, houve um pedido de recurso sobre isso: aqui
Outras dicas
Se java.io.console não funciona para você (eu não tentei isso), tente JLine . Usei-o para resolver um vagamente semelhante problema .
Infelizmente não é possível de uma maneira portátil:
http://forums.sun.com/thread.jspa?threadID= 5351637 & messageID = 10526512
No Windows, a leitura de System.in irá bloquear até enter
é pressionado, mesmo quando você não usar um BufferedReader
. Setas irá percorrer o histórico de comandos. Tente você mesmo:
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);
}
}
}
Mesmo problema usando a classe Console
(entrada tamponada no Windows, as setas intepreted pelo 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);
}
}
}
Não com built-in de código Java. Confira java maldições bibliotecas ou JLine como mencionado acima, se você quiser continuar.