[Respondido] manter tecla pressionada gera varias chamadas a keyPressed/Released

6 respostas
T

quando eu mantenho uma tecla pressionada…por exempla a tecla VK_LEFT;
o listener “pensa” que eu estou apertando e soltando a tecla repetidas vezes…
o resumo do codigo

public void keyPressed(KeyEvent e)
{
    switch (e.getKeyCode()) {
        case KeyEvent.VK_LEFT:
            System.out.println("Tecla pŕessionada!");
	break;
}}

public void keyReleased(KeyEvent e) 
{
    switch (e.getKeyCode()) {
        case KeyEvent.VK_LEFT:
            System.out.println("Tecla solta!");
	break;
}}

gera a saida:

Tecla pŕessionada!
Tecla solta!
Tecla pŕessionada!
Tecla solta!
Tecla pŕessionada!
Tecla solta!
Tecla pŕessionada!
Tecla solta!

o problema é que eu quero chamar um metodo pelo press e released, mas só quando a tecla for realmente pressionada e solta, mas nao quando se mantiver pressionada… esta confusão do listener esta me deixando confuso…

6 Respostas

lina

Oi,

testei seu código aqui e funciona perfeitamente...

segue.:

addKeyListener
(
	new KeyAdapter()
	{
		public void keyPressed(KeyEvent e)   
		{   
			if	(
					e.getKeyCode()		==	KeyEvent.VK_LEFT
				)
			{
				System.out.println("Pressed");   
			}
		}   
				  
		public void keyReleased(KeyEvent e)   
		{   
			if	(
					e.getKeyCode()		==	KeyEvent.VK_LEFT
				)
			{
				System.out.println("Released");   
			}
		}
	}
);
Resultado.:
Pressed
Pressed
Pressed
Pressed
Pressed
Pressed
Released
Pressed
Pressed
Pressed
Pressed
Pressed
Released
Pressed
Pressed
Pressed
Pressed
Pressed
Pressed
Pressed
Pressed
Released
Tchauzin!
Jesuino_Master
lina:
Oi,

testei seu código aqui e funciona perfeitamente...

segue.:

addKeyListener
(
	new KeyAdapter()
	{
		public void keyPressed(KeyEvent e)   
		{   
			if	(
					e.getKeyCode()		==	KeyEvent.VK_LEFT
				)
			{
				System.out.println("Pressed");   
			}
		}   
				  
		public void keyReleased(KeyEvent e)   
		{   
			if	(
					e.getKeyCode()		==	KeyEvent.VK_LEFT
				)
			{
				System.out.println("Released");   
			}
		}
	}
);
Resultado.:
Pressed
Pressed
Pressed
Pressed
Pressed
Pressed
Released
Pressed
Pressed
Pressed
Pressed
Pressed
Released
Pressed
Pressed
Pressed
Pressed
Pressed
Pressed
Pressed
Pressed
Released
Tchauzin!
NO caso da Lina, você pode "amarrar" a chamada do evento por uma variável booleana também... Assim ele só chama a instrução que corresponde a impressão de "Pressed" uma vez até você soltar e apertar o botão de novo.

OBS: Mas isso é meio feio...

T

Manter uma tecla pressionada ativa a auto-repetição. Para comprovar isso, mantenha uma tecla qualquer (como a letra A) e a mantenha pressionada. Não é porque a tecla é o Shift ou o Control que ela não tem auto-repetição.

T

da pra desativar esta auto-repetição sem usar boolean ?

R

A auto-repetição das teclas é uma características do subsistema de entrada de dados do seu sistema operacional (Windows, Linux) ou ambiente operacional (Gnome, KDE), ou seja, é algo que idealmente não deveria ser gerenciado pela sua aplicação. Assim, em vez de desativar a auto-repetição, o ideal é detectar e processar essa situação de alguma maneira dentro da sua aplicação, sendo uma saída possível a variável boolean sugerida anteriormente.

T

Bom…ja que nao tem jeito…vou tentar com boolean mesmo,…
è que com boolean estava parecendo meio gambiarra,mas já que é assim ^^.

Obrigado a todos pelo esclarecimento !

Criado 14 de julho de 2009
Ultima resposta 21 de jul. de 2009
Respostas 6
Participantes 5