KeyReleased não funciona bem!

9 respostas
mrbox

Olá pessoal,

Estou desenvolvendo uma aplicação com JFrame onde não terei no frame nenhum componente que recebe foco.
Quando o usuário pressionar determinadas teclas, realizarei algumas funcionalidades.

Acontece que a principal funcionalidade será realizada quando o usuário soltar uma tecla.
Então estou utlizando o método KeyReleased, que segundo o próprio site da sun

http://java.sun.com/j2se/1.4.2/docs/api/java/awt/event/KeyListener.html

este evento é disparado apenas quando o usuário SOLTAR uma tecla.

O evento até que funciona bem, mas quando pressionamos uma tecla e deixamos pressionada por alguns segundos, o evento é disparado também.
Preciso que seja disparado apenas quando soltar a tecla.

Abaixo segue um código de exemplo.
Pressione a tecla ESC e rapidamente solte-a, então o envento será disparado (perfeito).
Pressione a tecla ESC e segure-a por alguns segundos. O evento será disparado do mesmo jeito (problema).

Alguma solução ?

import java.awt.event.KeyEvent;
import java.awt.event.KeyListener;
import javax.swing.*;

public class Principal {
	
	public static void main(String[] args) {
		JFrame frame;
		
		frame = new JFrame("TESTE");
		frame.getContentPane().setLayout(null);
		frame.setBounds(50,50,200,200);
		frame.setVisible(true);
		frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
		
		frame.addKeyListener(new KeyListener(){
 			public void keyPressed(KeyEvent arg0){

 			}
 			public void keyTyped(KeyEvent arg0) {
 			}
 			public void keyReleased(KeyEvent e) {
 				int code = e.getKeyCode();
 				if (code == KeyEvent.VK_ESCAPE){
 					JOptionPane.showMessageDialog(null,"Tecla ESC solta!");
 				} 				
 			}
 		});
	}
}

9 Respostas

lina

Amigo,
segurei mais que 1 minuto e não disparou o evento, só quando eu soltei… =P

Tchauzin!

T

Que sistema operacional você usou? No Windows 2003 (com JDK 1.4 e 6.0) ocorreu a mesma coisa que com a Lina (esperei e só mostrou a mensagem quando soltei a tecla, depois de alguns minutos).

mrbox

Estou usando Linux. Kurumin 6.1.

Será que tem a ver com o sistema operacioal?

Lina, qual seu sistema operacional?

Sami_Koivu

Windows XP, Java 1.6.0-b105 idem.

(Também se o teclado estiver com problemas… se bem que acho que é mais provável estar relacionado ao SO)

mrbox

[i]Pessoal,

O problema está relacionado ao sistema operacional.
No windows XP funcionou sem problemas, mas no Linux (Kurumin 6.1) não funfa.

Acredito ser um bug.[/i]

lina

Oi,
eu uso o Ubuntu 6.10…

sem problemas…

ramilani12

Testei com Windows 2000 SP4 com Java 1.4.2_10 e sem problemas respondeu em imediato …

D

vixe, vamos reabrir esse tópico?.

estou com o ubuntu 11.04 e não funciona. Alguma solução?

E

Faça a seguinte experiência: pegue um terminal (ou algum outro programa onde você possa olhar as teclas que você digita) e deixe a tecla P pressionada. Pode ser até na barra de endereços do browser.
Depois de um tempo relativamente curto, você verá a tecla P sendo repetida várias vezes.
Como é que isso funciona? Manter uma tecla pressionada faz com que o driver de teclado entre no modo de auto-repetição (também conhecido por “typematic” - estou dando o nome em inglês para ficar fácil de procurar no Google) e comece a mandar um monte de eventos KeyPressed/KeyReleased. Só algumas teclas (como Shift ou Control) não têm esse modo de auto-repetição.

Veja se o Linux tem algum modo de controlar a auto-repetição. No Windows, o comando é “mode con rate=r delay=d”.

EDIT - No Linux: http://linux.die.net/man/8/kbdrate

Criado 21 de março de 2007
Ultima resposta 11 de nov. de 2011
Respostas 9
Participantes 7