Como parar repetidos events keyPressed () / keyReleased () no Swing

Então, o problema que estou tendo parece ser um bug que ocorre apenas no Linux. Estou tentando fazer com que meu aplicativo de swing seja gravado quando uma tecla é pressionada e, em seguida, para detectar quando essa tecla é liberada. Agora, isso não deveria estar em questão, porque o KeyListener deve lidar com isso para mim.

O problema é que, quando mantenho a tecla pressionada, recebo vários events keyPressed () / keyReleased () repetidos, em vez de apenas o único keypressed (). Alguém tem uma solução ou solução para saber quando uma chave é realmente liberada no linux?

Obrigado.

Então o problema que estou tendo parece ser um bug que ocorre apenas no Linux

Sim, este é um problema do Linux.

No Windows, quando uma tecla é pressionada, você recebe vários events KeyPressed, mas apenas um único evento KeyReleased.

Esta pergunta é feita frequentemente e eu nunca vi uma boa solução.

Mas acho que a base de uma solução é usar um Timer. Quando a tecla é pressionada, você inicia um Timer. Quando você recebe outro keyPressed você reiniciar o timer. Assim, contanto que o intervalo do timer seja maior que a taxa de repetição do teclado, o timer será reiniciado continuamente quando uma tecla for pressionada. Quando keyPresses param de ser gerados, o Timer irá triggersr, então você assume que a tecla foi liberada. Isto implica que você terá um atraso no processamento do keyReleased.

Esta questão é duplicada aqui .

Aqui está um hack implementado como um AWTEventListener que pode ser instalado no início do aplicativo.

Aqui está o bug da Sun (inclui exemplos de soluções alternativas): http://bugs.sun.com/view_bug.do?bug_id=4153069

Você pode encontrar uma boa solução aqui .

Use a implementação de KeyEventDispatcher, com isso você fará as chaves corretamente.