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.

Foi útil?

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.

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top