[Swing / invokeLater?] - Teclado travado [Resolvido]

Oi,

Estou tentando solucionar um BUG na aplicação que ocorre no sistema operacional Windows 7 (Só no Windows 7).

Descrição do BUG:

  • O teclado para de funcionar, só voltando momentos depois, quando utilizado o mouse (botão esquerdo)

Como fazer o BUG acontecer:

  • Tenho uma janela com vários JButton simulando atalhos (F1, F2, F3… F9).
  • Pressiono a tecla F1 e abro a minha janela.
  • Preencho toda a tela e clico em finalizar (ação dispose)
  • Volto para a tela principal com os JButton (F1, F2, F3… F9)
  • Tento pressionar F1: Não acontece nada.
  • Tento pressionar F2: Não acontece nada.
  • Aperto varias e varias vezes qualquer atalho (pelo teclado): Não acontece nada.
  • Clico com o mouse no JButton F1: Todas as teclas que pressionei nos itens anteriores se libertam e fazem suas funções.

Ou seja, algo está bloqueando meu teclado e só liberando quando executo a ação do mouse sobre o JButton.

Informações importantes:

  • Trabalhamos com CVS, então o código pode ter todo e qualquer tipo de “porcaria”.
  • Existem alguns invokeLater com utilização errada. Já tirei todos e o BUG continua.

Existe algum método sagrado que liberte todos os eventos blocantes, por exemplo?

Tchauzin!

Voce ja fez um debug pelo compilador ? ate o ultimo momento em que isso acontece ? Uma vez tive um problema parecido, em determinado momento o compomente JButton nao funcionava mais (nao era o teclado, mas… ) verifiquei pelo debug que o botao ao final da execucao disparava um fireaction e se perdia numas exception muito louca (aplicacao feita pelo netbeans), se perdia naqueles codigos excessivos do netbeans. Como fiz pra resolver ? refiz a merda do JButton e resolveu, vai saber o.O

Bom, é so uma experiencia que tive, estou compartilhando, talvez gera uma ideia na sua mente, hehehe =D

[quote=rof20004]Voce ja fez um debug pelo compilador ? ate o ultimo momento em que isso acontece ? Uma vez tive um problema parecido, em determinado momento o compomente JButton nao funcionava mais (nao era o teclado, mas… ) verifiquei pelo debug que o botao ao final da execucao disparava um fireaction e se perdia numas exception muito louca (aplicacao feita pelo netbeans), se perdia naqueles codigos excessivos do netbeans. Como fiz pra resolver ? refiz a merda do JButton e resolveu, vai saber o.O

Bom, é so uma experiencia que tive, estou compartilhando, talvez gera uma ideia na sua mente, hehehe =D[/quote]

Oi,

Não tenho o código (nem eclipse) para debugar nessa maquina do Windows 7. Utilizo XP e não acontece.

Estou debugando por sysout =/

Tchauzin!

putz, ai é dose ‘-’, boa sorte!!

Como você está vinculando os atalhos as teclas? Com InputMap e ActionMap? Usando a EventQueue da AWT diretamente? Ou através de eventos?

Oi,

EventQueue da AWT.

Já que tocamos nesse assunto, a minha primeira tentativa foi comentar esta função, e após isso realizei o teste novamente:

  • Tenho uma janela com vários JButton simulando atalhos (F1, F2, F3… F9).
  • Pressiono com o mouse o JButton F1 e abro a minha janela (não consigo por teclado, pois comentei o AWT).
  • Preencho toda a tela e clico em finalizar (ação dispose)
  • Volto para a tela principal com os JButton (F1, F2, F3… F9)
  • Pressiono com o mouse o JButton F2 (abre uma tela com 2 campos JTextField).
  • Não consigo digitar nada.
  • Fecho (dispose) a tela do F2.
  • Clico com o mouse no F1: Todos as teclas digitas no JTextField da tela F2 são liberadas.

Tchauzin!

Oi,

Retirei todo o esquema AWT e implementei tudo via KeyStroke e ActionMap, conforme seu link:

http://www.guj.com.br/java/140986-como-acionar-os-bots-de-uma-calculadora-atrav-do-teclado

Fiz uma modificação para usar Reflection no actionPerformed.

@Override public void actionPerformed(ActionEvent e) { ((JButton)io_atalhos.getClass().getField(this.ls_key).get(io_atalhos)).doClick(); }

Isso evitaria ter que criar vários IF e ELSE.

Assim que conseguir fazer um teste, postarei o resultado!

Tchauzin!

Oi,

Só para avisar que consegui encontrar o problema.

O lance era que eu tinha duas referencias ativas de uma mesma janela JDialog. Quando eu chamava o método WindowsClose para dar o dispose, ele fechava apenas 1 referencia, permanecendo a outra ativada com o método setVisible(false).

Após eliminar todas as referencias o problema desapareceu.

Tchauzin!

:slight_smile: