Rilevamento e agendo sui tasti direzionali della tastiera in Java
Domanda
Buongiorno tutti,
Ho un progetto console in cui sono destinati, l'utente preme i tasti di direzione della tastiera (tastiera non numerico) per spostare un avatar. Sto avendo difficoltà di codifica per verificare la pressione di questi tasti. In Pascal è stato abbastanza facile da usare "ReadKey" e il codice, ad esempio, per il # 80 per la pressione del tasto giù. Tuttavia, Stumped come implementare la stessa funzionalità in Java, anche se credo di aver capito l'uso di System.in e BufferedInputStream.
Qualcuno potrebbe darmi una mano? I vostri pensieri o suggerimenti sono molto apprezzati.
Soluzione
Il problema di supporto Console in Java è ben noto, non sono sicuro che questo è fattibile.
Questo non è stato inizialmente possibile con System.in in quanto è abituato a lavorare line-based.
Sun alla fine ha aggiunto una classe java.io.Console.
Ecco le sue JavaDocs: http://java.sun.com/javase/ 6 / docs / api / java / io / Console.html
Una volta che la console (credo da System.Console), è possibile ottenere un lettore e, forse, leggere caratteri da esso, ma non sono sicuro se include chiavi.
In generale, si suppone di utilizzare swing o AWT se si vuole accedere alla tastiera, che è stupido.
A partire dal 2007, c'è stata una richiesta di funzionalità su di esso: qui
Altri suggerimenti
Se java.io.console non funziona per voi (non ho provato), prova a JLine . L'ho usato per risolvere un vagamente simile problema .
Purtroppo questo non è possibile in un modo portabile:
http://forums.sun.com/thread.jspa?threadID= 5351637 & messageId = 10526512
In Windows, la lettura da System.in bloccherà fino a quando non viene premuto enter
, anche quando non si utilizza un BufferedReader
. Frecce scorrere la cronologia dei comandi. Provate voi stessi:
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);
}
}
}
Lo stesso problema utilizzando la classe Console
(ingresso tamponata in ambiente Windows, i tasti freccia interpretate da 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);
}
}
}
Non con built-in codice Java. Partenza java maledice biblioteche o JLine come detto sopra, se si desidera continuare.