Olá pessoal,
Estou com o seguinte problema:
Preciso capturar tecla pressionada ( Sem esperar o Enter - ou seja, cada toque no teclado precisa retornar a tecla pressionada sem o usuário teclar o enter ) mas usando java no modo console, ou seja, não posso usar classes que estejam vinculadas a interface gráfica.
Vi que tenho que chamar um código em linguagem C usando JNA…
Tentei os seguintes códigos usando código nativo com JNA mas não consegui. Onde estou errando???
/** Classe principal **/
import com.sun.jna.Native;
public class Teclado {
/**
* @param args
*/
public static void main(String[] args) {
ILerTeclado caracter = (ILerTeclado) Native.loadLibrary("lerTeclado2", ILerTeclado.class);
Integer c;
while(true){
c = caracter.lerTecla();
System.out.println("tecla >> " + c);
}
}
}
/** Interface **/
import com.sun.jna.Library;
public interface ILerTeclado extends Library {
public int lerTecla();
}
/** Código em linguagem C**/
#include "curses.h"
#include "stdio.h"
#include "lerTeclado.h"
char lerTecla(){
char c;
c= getch();
return c;
}
gente, tentei o seguinte código abaixo tb, porém, ele espera o ENTER e tclas especiais não pega:
#include "stdio.h"
#include "lerTeclado.h"
#include "curses.h"
#include "termios.h" //Biblioteca necessária...
#include "unistd.h" //Biblioteca necessária...
char lerTecla(){
struct termios lxgetch_orig, lxgetch_new; //Define as variáveis 'lxgetch_orig' e 'lxgetch_new' como do tipo termios;
int lxgetch_ch; //Variável que armazena o código ascii da tecla pressionada;
tcgetattr(STDIN_FILENO, &lxgetch_orig); //Armazena-os na variável lxgetch_orig,os parâmetros associados com os objectos de entrada estandardizada;
lxgetch_new = lxgetch_orig; //Copia os parâmetros armazenados na variável lxgetch_orig para a variável lxgetch_new;
lxgetch_new.c_lflag &= ~(ICANON | ECHO); //Muda os parâmetros dos modos locais da variável lxgetch_new, para modo canónico e ecoa caracteres de entrada;
lxgetch_new.c_iflag &= ~(ISTRIP | INPCK); //Muda os parâmetros dos modos de entrada da variável lxgetch_new, para cortar o oitavo bit e verificar paridade na entrada;
tcsetattr(STDIN_FILENO, TCSANOW, &lxgetch_new); //Define imediatamente os novos parâmetros de entrada estandardizada, que estão na variável lxgetch_new;
lxgetch_ch = getchar(); //Lê a tecla pressionada;
tcsetattr(STDIN_FILENO, TCSANOW, &lxgetch_orig); //Volta a colocar os parâmetros originais dos objectos de entrada estandardizada;
return lxgetch_ch; //Retorna o código ascii da tecla pressionada;
}
Se alguém puder me ajudar, estou precisando muito disso funcionando!!!
Obrigado