Evento com JInput numa aplicação Swing

3 respostas
rock-skull

Olá.

Eu peguei pra estudar um pouco de Joystick. Achei essa API JInput: http://java.net/projects/jinput/ , e logo depois esse site: http://fivedots.coe.psu.ac.th/~ad/jg2/ch11/index.html .

Li, fucei os exemplos e consegui fazer um programinha básico em Swing que identifica e mostra qual o botão foi apertado e tudo mais.

Acontece o seguinte. Eu quero interfacear o Joystick com um programa que eu tenho pro Mestrado que controla um braço robótico. Ele envia, atualmente, comandos seriais. O Robô leva um tempo pra executar o comando (dependendo de quanto você pediu pra ele andar) E eu fico lendo a porta esperando essa resposta. Até aí tudo bem.

O Problema é que na implementação do Joystick, os botões são reconhecidos através de um actionListener, que é adicinado em um javax.swing.Timer, com delay de 40 milisegundos. Ou seja, de 40 em 40 milisegundos ele disparar um evento (ActionPerformed) onde eu verifico se algum botão/direcional está sendo apertado.

O Problema é que se eu atribuir esse botão à um comando do robô ele vai disparar repetidamente e o robô não vai funcionar como esperado.

A pergunta é, como eu posso fazer isso? Olhando a documentação da API, o único Listerner que ele tem só verifica quando o Joystick foi plugado/desplugado;

O ideal é que eu pudesse fazer com que o Joystick disparasse um evento ao perceber um botão.

Segue o código atual:

private void startPolling(){
    ActionListener pollPerformer = new ActionListener() {
      public void actionPerformed(ActionEvent e)
      {
        //Faz algumas rotinas verificando o estado dos botões
      }
    };

    pollTimer = new Timer(DELAY, pollPerformer);
    pollTimer.start();
  }

3 Respostas

ViniGodoy

Use C++ com SDL: http://www.libsdl.org/ ou, se precisar de interface gráfica com botões, o Qt: http://qt.nokia.com/products/

Vai ser mais fácil integrar com hardwares externos, controlar joysticks, kinetic, portas seriais, etc.

Caso você queira realmente usar a JInput, você terá que criar uma variável para guardar o estado anterior da tecla do joystick, e só repassar o evento para o robo caso esse estado mude.

Na SDL, os eventos são disparados apenas quando o estado muda.

rock-skull

Não preciso necessariamente continuar com a JInput. Peguei, pois achei esse texto explicando o uso, e porque ela tem fácil portabilidade.

Não posso migrar pra C++ ou pra Qt, pois a minha aplicação do Robô já está pronta e em Java, ela é multiplataforma (A aplicação é educacional, então é interessante que seja).

Se tiver alguma outra biblioteca que talvez resolva meu problema.

ViniGodoy

Nesse caso, continue com a JInput mesmo. Só que você terá que guardar os estados dos comandos em algum lugar, para não repassar estados repetidos para o robo.

Criado 18 de março de 2011
Ultima resposta 19 de mar. de 2011
Respostas 3
Participantes 2