[Resolvido] Evento KeyPressed com muitas execuções

8 respostas
vigmonster

Olá pessoal, estou com uma dúvida, tenho o código abaixo dentro de um construtor de um JFrame.

Ao clicar nas teclas F11 ou F12, quero que a mesma execute os métodos. Porém ao clica nas teclas, os eventos sao executados várias vezes.
(Como se pegasse os segundos que a tecla esta pressionada e vai executando.)

Coloquei um System.out.println() para ver as execuções.

Se pressiono 'F11' no teclado, deveria sair "F11" e executar o método. Mas a saída é: "F11 F11 F11 F11 F11....." por ai vai.

Gostaria que o sistema travasse apenas para uma digitação. (F11 ou F12). Seria um KeyTyped no lugar de KeyPressed?
Como fazê-lo. Desde já agradeço.

Um forte abraço:

Código (dentro de um construtor de um JFrame.):

Toolkit.getDefaultToolkit().addAWTEventListener(new AWTEventListener() {

            public void eventDispatched(AWTEvent event) {
                KeyEvent ev = (KeyEvent) event;

                    if (ev.getKeyCode() == KeyEvent.VK_F11) {
                        System.out.println("F11");
                        previous();
                    }
                    if (ev.getKeyCode() == KeyEvent.VK_F12) {
                        System.out.println("F12");
                        next();
                    }
                }
            
        }, AWTEvent.KEY_EVENT_MASK);

8 Respostas

eliangela

Olá!

Tenta colocar esse código no seu construtor:

addKeyListener(new KeyAdapter() {

	@Override
	public void keyReleased(KeyEvent ev) {
		if (ev.getKeyCode() == KeyEvent.VK_F11) {
			System.out.println("F11");
		}
		if (ev.getKeyCode() == KeyEvent.VK_F12) {
			System.out.println("F12");
		}
	}
});

Espero ter ajudado.

vigmonster

Olá Eliangela! Obrigado pela contribuição, mas digo que infelizmente não solucionou meu problema, fiz os imports necessários e na depuração ele nem entra no método. Logo não imprime as linhas nenhuma vez.
Se tiver mais alguma idéia será muito bem vinda.
Um abraço!

AlissonSchneider

Amigo tava dando uma olhada em outro tópico aqui do guj, porém eu acho que lá tb não deu certo :frowning: mas conhecimento nunca é demais segue o link

abrass

:wink:

vigmonster

Valeu Alisson. Pelo visto eu vou ter que criar uma gambiarra mesmo com boolean. Vou ver o que consigo aqui. Abraço! Se alguém tiver uma solução mais fácil, não hesite em compartilhar. Até mais.

vigmonster

Minha POG (Programação Orientada à Gambiarras) que funcionou:

Um contador int que bloqueia 3 execuções sequenciais. (Demorei também pra descobrir que eram sempre 3.)

Toolkit.getDefaultToolkit().addAWTEventListener(new AWTEventListener() {

            public void eventDispatched(AWTEvent event) {
                KeyEvent ev = (KeyEvent) event;

                if (cont == 0) {
                    if (ev.getKeyCode() == KeyEvent.VK_F11) {
                        System.out.println("F11");
                        previous();
                    }
                    if (ev.getKeyCode() == KeyEvent.VK_F12) {
                        System.out.println("F12");
                        next();
                    }

                }
                cont++;
                if (cont == 2) {
                    cont = 0;
                }

            }
        }, AWTEvent.KEY_EVENT_MASK);

Quero agradecer a todos aqui do fórum, perdi muito tempo longe dele.
Abraço a todos.

Eric_Yuzo

O seu método é executado 3 vezes porque o AWTEventListener está pegando os KeyEvents. Quando se digita uma tecla, são disparados o keyPressed, keyReleased e KeyTyped. E o AWTEventListener captura todos os três.

Qual sua intenção com isso? Fazer com que o método seja executado toda vez que as teclas F11 ou F12 forem pressionadas não importando onde esteja o foco?

Se for isso, a solução mais elegante seria registrar isso no InputMap. Neste tópico tem um exemplo com números, bastaria adaptar para o seu caso, que seria o F11 e F12.

eliangela

Ah! Entendi!

Então segue a solução para seu problema:
Toolkit.getDefaultToolkit().addAWTEventListener(new AWTEventListener() {

			public void eventDispatched(AWTEvent event) {
				KeyEvent ev = (KeyEvent) event;

				if (ev.getID() == KeyEvent.KEY_RELEASED) { //este IF compara o tipo de evento de tecla
					if (ev.getKeyCode() == KeyEvent.VK_F11) {
						System.out.println("F11");
					}
					if (ev.getKeyCode() == KeyEvent.VK_F12) {
						System.out.println("F12");
					}
				}
			}
		}, AWTEvent.KEY_EVENT_MASK);

até mais

vigmonster

Agora sim. Funcionando e elegante!
Obrigado a todos! Um forte abraço e até a próxima.

Criado 16 de janeiro de 2011
Ultima resposta 18 de jan. de 2011
Respostas 8
Participantes 4