Java >> Java Program >  >> Java

Upptäcka och agera på tangentbordets riktningstangenter i Java

Om java.io.console inte fungerar för dig (jag har inte provat det), prova JLine. Jag använde det för att lösa ett vagt liknande problem.


Problemet med konsolsupport i Java är välkänt, jag är inte säker på att detta är genomförbart.

Detta var från början inte möjligt med System.in eftersom det brukade fungera linjebaserat.

Sun lade så småningom till en java.io.Console-klass.

Här är dess JavaDocs:http://java.sun.com/javase/6/docs/api/java/io/Console.html

När du väl har fått konsolen (tror jag från System.console) kan du skaffa en läsare och kanske läsa tecken från den, men jag är inte säker på om den innehåller nycklar.

I allmänhet är det meningen att du ska använda Swing eller AWT om du vill ha tillgång till tangentbordet, vilket är dumt.

Från och med 2007 fanns det en funktionsbegäran om det:här


Tyvärr är detta inte möjligt på ett portabelt sätt:

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

På Windows blockeras läsning från System.in till enter är nedtryckt, även när du inte använder en BufferedReader . Pilarna går igenom kommandohistoriken. Prova själv:

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

Samma problem med Console klass (indata buffrad under Windows, piltangenterna tolkade av 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);
    }
  }
}

Java-tagg