2009-02-21 8 views
8

G'day tutto,Rilevamento e agendo sui tasti di direzione tastiera in Java

Ho un progetto console in cui sono destinati, l'utente preme i tasti di direzione della tastiera (tastiera non numerico) per spostare un avatar. Ho difficoltà a programmare per verificare la pressione di questi tasti. In Pascal è stato abbastanza facile usare "readkey" e il codice, ad esempio, per # 80 per il tasto premuto giù. Tuttavia, sono convinto di come implementare la stessa funzionalità in Java, anche se penso di capire l'uso di System.in e BufferedInputStream.

Qualcuno potrebbe darmi una mano? I tuoi pensieri o suggerimenti sono molto apprezzati.

risposta

5

Il problema del supporto della console in Java è ben noto, non sono sicuro che ciò sia fattibile.

Inizialmente non era possibile con System.in poiché era utilizzato per lavorare in base alla linea.

Sun ha infine 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 il console (credo da System.Console), è possibile ottenere un lettore e, forse, leggere caratteri da esso, ma non sono sicuro se include chiavi.

In genere, è necessario utilizzare Swing o AWT se si desidera accedere alla tastiera, il che è sciocco.

A partire dal 2007, c'è stata una richiesta di funzionalità su di esso: here

+0

Grazie mille. Potrei quindi tornare a Pascal o provare a implementare il mio progetto in Swing. – elwynn

+0

Consiglierei Swing. – Eddie

+0

Non tornare a Pascal. Java ha molti vantaggi. Le applicazioni console utilizzano la console principalmente per l'output e l'input basato sulla linea, non erano pensate per un'interazione completa, era un'aberrazione di DOS che è ancora supportata in Pascal. – Uri

6

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 se non si utilizza uno BufferedReader. Le frecce scorreranno ciclicamente nella 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); 
    } 
    } 
} 

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

Se java.io.console non funziona per voi (Non ho provato quello), prova JLine. L'ho usato per risolvere uno vaguely similar problem.

+0

JLine è decisamente la strada da percorrere, ancora adesso! – javanna