Em Java, qual é a melhor maneira de capturar um pressionamento de tecla ?
-
25-09-2019 - |
Pergunta
Estou tendo problemas para capturar ou003Ctab> Tecla no meu aplicativo de linha de comando Java. Usando o System.in.read () Parece que não tenho nada ao atingir a tecla de guia. Qual é a melhor maneira de abordar isso?
Para dar algum contexto, estou tentando permitir que um usuário atinja a tecla TAB no meio do comando para que ela preencha o comando automaticamente (assim como você pode fazer em um shell de festa). Estou aberto a sugestões se houver melhores abordagens para conseguir isso (talvez usando o system.in.read () não é o melhor ângulo para abordar isso?).
Solução
Dê uma olhada em Jline. Eu não usei sozinho. Ele usa uma DLL do Windows (usando JNI) e possui suporte ao Linux para alternar o console para o modo de caractere/bruto em vez do modo buffer. Eu nunca usei isso antes, então uso por sua conta e risco. Também não tenho 100% de certeza se isso abordará seu problema, mas vale a pena tentar :)
EDITAR: Eu posso confirmar que funciona
ConsoleReader cr = new ConsoleReader();
while (cr.readVirtualKey() != 0x09){
//loop till Tab is pressed
}
Editar novamente: A biblioteca contém preenchimento automático (pressionando a guia) para a linha de comando ... aproveite :)
Outras dicas
Eu acho que seu shell está capturando a guia e impedindo que ela chegue ao seu aplicativo. Pode não haver nada que você possa fazer sobre isso ...
Os dados de um InputStream são disponibilizados apenas quando o usuário pressionou Enter. Eu acho que você descobrirá que, se pressionar Enter após a guia, a guia será exibida.
Em C Applications, há algo semelhante: um shell define o modo de entrada para RAW a partir de cozido, pois precisa das teclas cruas. ReadLine é a biblioteca normal usada para isso no Linux. Não tenho certeza do que é comum no Windows. Tanto quanto posso pensar, algo usando o JNI é a única opção aqui.