2009-02-21 13 views
8

G'Day wszystko,Wykrywanie i działając na klawiszy kierunkowych klawiatury w Javie

Mam projekt konsoli, w którym jest on przeznaczony użytkownik naciśnie klawiszy kierunkowych klawiatury (klawiatura numeryczna nie), aby przesunąć awatara. Mam problem z kodowaniem, aby sprawdzić naciśnięcie tych klawiszy. W języku Pascal łatwo było użyć "readkey" i kodu, na przykład, dla # 80 dla naciśnięcia klawisza w dół. Jednak jestem zaskoczony, jak zaimplementować tę samą funkcjonalność w Javie, ale myślę, że rozumiem użycie System.in i BufferedInputStream.

Czy ktoś może mi pomóc? Twoje myśli i wskazówki są doceniane.

Odpowiedz

5

Problem obsługi konsoli w Javie jest dobrze znany, nie jestem pewien, czy jest to wykonalne.

Nie było to początkowo możliwe w systemie System.in, ponieważ był używany do pracy w linii.

Firma Sun ostatecznie dodała klasę java.io.Console.

Oto jego Javadocs: http://java.sun.com/javase/6/docs/api/java/io/Console.html

Gdy dojdziesz do konsoli (myślę ze System.console), można uzyskać czytnika i może odczytać znaki z nim, ale nie jestem pewien, czy zawiera ona klawiatura.

Generalnie powinieneś używać Swing lub AWT, jeśli chcesz uzyskać dostęp do klawiatury, co jest głupie.

Począwszy od roku 2007, było cechą prośba o tym: here

+0

Dziękuję bardzo. Mogę wtedy wrócić do Pascala lub spróbować zrealizować mój projekt w Swing. – elwynn

+0

Polecam Swing. – Eddie

+0

Nie wracaj do Pascala. Java ma wiele zalet. Aplikacje konsolowe wykorzystują konsolę przede wszystkim do wyjścia i wejścia liniowego, nie były przeznaczone do pełnej interakcji, co było aberracją DOS, która wciąż jest obsługiwana w Pascalu. – Uri

6

Niestety nie jest to możliwe w przenośny sposób:

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

W Windows, czytając z System.in będzie blokować do momentu naciśnięcia przycisku enter, nawet jeśli nie używasz BufferedReader. Strzałki będą przechodzić przez historię poleceń. Spróbuj to sam:

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

sam problem przy użyciu klasy Console (wejście buforowany pod Windows, klawisze strzałek intepreted przez system 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

Jeśli java.io.console nie działa dla Ciebie (Nie próbowałem tego), spróbuj JLine. Użyłem go do rozwiązania vaguely similar problem.

+0

JLine to zdecydowanie droga, jeszcze nie teraz! – javanna

Powiązane problemy