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.):
[code]
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);[/code]
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.
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!
Amigo tava dando uma olhada em outro tópico aqui do guj, porém eu acho que lá tb não deu certo
mas conhecimento nunca é demais segue o link
abrass

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.
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.)
[code] 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);[/code]
Quero agradecer a todos aqui do fórum, perdi muito tempo longe dele.
Abraço a todos.
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.
Ah! Entendi!
Então segue a solução para seu problema:
[code] 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);[/code]
até mais
Agora sim. Funcionando e elegante!
Obrigado a todos! Um forte abraço e até a próxima.