KeyListener 2 teclas. [RESOLVIDO]

12 respostas
Z

Olá, quero utilizar um atalho para meu botão… do tipo CTRL + S (Apertaria o botão e salvava os resultados).

Teria como fazer isso utilizando KeyListener ? Como?

12 Respostas

M

voce pode adicionar um flag de quando o CTRL for precionado

Z

Realmente pensei nisso… mas eu quero só aceitar salvar se o CTRL estiver segurado e logo após apertar o S.

Dai a flag não resolve.

M

Zagaia:
Realmente pensei nisso… mas eu quero só aceitar salvar se o CTRL estiver segurado e logo após apertar o S.

Dai a flag não resolve.

package awt;

import java.awt.event.KeyEvent;
import java.awt.event.KeyListener;

public class CtrlListener implements KeyListener {

	private boolean ctrl = false;

	public void keyPressed(KeyEvent arg0) {
		// aperta o ctrl
		if (arg0.getKeyCode() == KeyEvent.VK_CONTROL) {
			this.ctrl = true;
		}
	}

	public void keyReleased(KeyEvent arg0) {
		// solta o ctrl
		if (arg0.getKeyCode() == KeyEvent.VK_CONTROL) {
			this.ctrl = false;
		}
	}

	public void keyTyped(KeyEvent arg0) {
		if ((arg0.getKeyCode() == KeyEvent.VK_S) && this.ctrl) {
			// SALVA AQUI
		}
	}

}
Z

Opa!

Não funcionou cara..

segue:

public void keyPressed(KeyEvent arg0) {   
	System.out.println("Aperta o CTRL");
	if (arg0.getKeyCode() == KeyEvent.VK_CONTROL) {   
		ctrl = true;   
	}   
}   
				  
public void keyReleased(KeyEvent arg0) {   
	System.out.println("Solta o CTRL");   
	if (arg0.getKeyCode() == KeyEvent.VK_CONTROL) {   
		ctrl = false;   
	}   
}   
				  
public void keyTyped(KeyEvent arg0) {   
	System.out.println(arg0.getKeyChar()+" "+arg0.getKeyCode());
	if ((arg0.getKeyCode() == KeyEvent.VK_S) && ctrl) {   
		System.out.println("1");   
	}   
}

Traces:

Aperta o CTRL
 0
Solta o CTRL

O caracter no KeyTyped saiu como um caracter estranho e codigo 0

Abraços!

M
Zagaia:
Opa!

Não funcionou cara..

segue:

public void keyPressed(KeyEvent arg0) {   
	System.out.println("Aperta o CTRL");
	if (arg0.getKeyCode() == KeyEvent.VK_CONTROL) {   
		ctrl = true;   
	}   
}   
				  
public void keyReleased(KeyEvent arg0) {   
	System.out.println("Solta o CTRL");   
	if (arg0.getKeyCode() == KeyEvent.VK_CONTROL) {   
		ctrl = false;   
	}   
}   
				  
public void keyTyped(KeyEvent arg0) {   
	System.out.println(arg0.getKeyChar()+" "+arg0.getKeyCode());
	if ((arg0.getKeyCode() == KeyEvent.VK_S) && ctrl) {   
		System.out.println("1");   
	}   
}

Traces:

Aperta o CTRL
 0
Solta o CTRL

O caracter no KeyTyped saiu como um caracter estranho e codigo 0

Abraços!

Verdade, ja tinha feito isso mas havia esquecido. Deu uma procurada por aqui e achei isso:

public class CtrlListener implements KeyListener {

	private boolean ctrl = false;

	public void keyTyped(KeyEvent arg0) {
		if ((arg0.getKeyCode() == KeyEvent.VK_S) && arg0.getModifiers() == KeyEvent.CTRL_MASK) {
			System.out.println("SALVA AQUI OH /o/");
		}
	}

}
Z
Mikhas:
Zagaia:
Opa!

Não funcionou cara..

segue:

public void keyPressed(KeyEvent arg0) {   
	System.out.println("Aperta o CTRL");
	if (arg0.getKeyCode() == KeyEvent.VK_CONTROL) {   
		ctrl = true;   
	}   
}   
				  
public void keyReleased(KeyEvent arg0) {   
	System.out.println("Solta o CTRL");   
	if (arg0.getKeyCode() == KeyEvent.VK_CONTROL) {   
		ctrl = false;   
	}   
}   
				  
public void keyTyped(KeyEvent arg0) {   
	System.out.println(arg0.getKeyChar()+" "+arg0.getKeyCode());
	if ((arg0.getKeyCode() == KeyEvent.VK_S) && ctrl) {   
		System.out.println("1");   
	}   
}

Traces:

Aperta o CTRL
 0
Solta o CTRL

O caracter no KeyTyped saiu como um caracter estranho e codigo 0

Abraços!

Verdade, ja tinha feito isso mas havia esquecido. Deu uma procurada por aqui e achei isso:

public class CtrlListener implements KeyListener {

	private boolean ctrl = false;

	public void keyTyped(KeyEvent arg0) {
		if ((arg0.getKeyCode() == KeyEvent.VK_S) && arg0.getModifiers() == KeyEvent.CTRL_MASK) {
			System.out.println("SALVA AQUI OH /o/");
		}
	}

}

Opa.. mesmo assim não funcionou, a condição && no KeyTyped fez com que ficasse igual a sua solução anterior... ele não vai entrar nunca no sysout, pq o KeyCode nao eh a letra S

Da uma olhada em como eu fiz:

//
// Adiciona um KeyListener no textfield.
//
textfield.addKeyListener
(
	new	KeyAdapter()
	{
		public
		void			keyPressed(KeyEvent evt) {	
			KeyExec(evt.getKeyCode());
		}
	}			
);

Depois ele chama esse método que vai fazer tudo:

/**
 * Método responsável por realizar o controle total do KeyBoard para este componente.
 * 
 * @param	an_key
 * 		Tecla pressionada do usuário
 * 
 * OBS: A variavel ib_ctrl_pressed é iniciada de false.
*/
public
void		KeyExec(int an_key)
{
	//
	// Verifica a tecla que foi pressionada.
	//
	switch (an_key)
	{
		case			KeyEvent.VK_DOWN:
				
			//
			// Aciona a flag indicando que a tecla CTRL está solta.
			//
			ib_ctrl_pressed		=	false;
				
			//
			// Chama a função responsável por avançar uma pagina.
			//
			NextExec();
				
			break;
				
		case			KeyEvent.VK_UP:
				
			//
			// Aciona a flag indicando que a tecla CTRL está solta.
			//
			ib_ctrl_pressed		=	false;
				
			//
			// Chama a função responsável por voltar  uma pagina.
			//
			PreviousExec();
				
			break;
				
		case			KeyEvent.VK_CONTROL:
				
			//
			// Aciona a flag indicando que a tecla CTRL está pressionada.
			//
			ib_ctrl_pressed		=	true;
			
			break;
				
		case			KeyEvent.VK_S:
			
			//
			// Verifica se a tecla CTRL está pressionada.
			//
			if	(ib_ctrl_pressed)
			{
				//
				// Chama a função responsável por Salvar as alterações na base.
				//
				SaveExec();
			}
				
			//
			// Aciona a flag indicando que a tecla CTRL está solta.
			//
			ib_ctrl_pressed		=	false;
				
			break;
				
		case			KeyEvent.VK_A:
				
			//
			// Verifica se a tecla CTRL está pressionada.
			//
			if	(ib_ctrl_pressed)
			{
				//
				// Chama a função de adicionar uma pagina.
				//
				AddExec();
			}
				
			//
			// Aciona a flag indicando que a tecla CTRL está solta.
			//
			ib_ctrl_pressed		=	false;
				
			break;
				
		case			KeyEvent.VK_E:
				
			//
			// Verficia se a tecla CTRL está pressionada.
			//
			if	(
					ib_ctrl_pressed
				)
			{
				//
				// Chama a função de remover uma pagina.
				//
				RemoveExec();
			}
				
			break;
				
		default:
				
			//
			// Aciona a flag indicando que a tecla CTRL está solta.
			//
			ib_ctrl_pressed		=	false;
			
			break;
	}
}

Será que isso é uma maneira horrivel de programação?

M
Zagaia:
Mikhas:
Zagaia:
Opa!

Não funcionou cara..

segue:

public void keyPressed(KeyEvent arg0) {   
	System.out.println("Aperta o CTRL");
	if (arg0.getKeyCode() == KeyEvent.VK_CONTROL) {   
		ctrl = true;   
	}   
}   
				  
public void keyReleased(KeyEvent arg0) {   
	System.out.println("Solta o CTRL");   
	if (arg0.getKeyCode() == KeyEvent.VK_CONTROL) {   
		ctrl = false;   
	}   
}   
				  
public void keyTyped(KeyEvent arg0) {   
	System.out.println(arg0.getKeyChar()+" "+arg0.getKeyCode());
	if ((arg0.getKeyCode() == KeyEvent.VK_S) && ctrl) {   
		System.out.println("1");   
	}   
}

Traces:

Aperta o CTRL
 0
Solta o CTRL

O caracter no KeyTyped saiu como um caracter estranho e codigo 0

Abraços!

Verdade, ja tinha feito isso mas havia esquecido. Deu uma procurada por aqui e achei isso:

public class CtrlListener implements KeyListener {

	private boolean ctrl = false;

	public void keyTyped(KeyEvent arg0) {
		if ((arg0.getKeyCode() == KeyEvent.VK_S) && arg0.getModifiers() == KeyEvent.CTRL_MASK) {
			System.out.println("SALVA AQUI OH /o/");
		}
	}

}

Opa.. mesmo assim não funcionou, a condição && no KeyTyped fez com que ficasse igual a sua solução anterior... ele não vai entrar nunca no sysout, pq o KeyCode nao eh a letra S

Da uma olhada em como eu fiz:

//
// Adiciona um KeyListener no textfield.
//
textfield.addKeyListener
(
	new	KeyAdapter()
	{
		public
		void			keyPressed(KeyEvent evt) {	
			KeyExec(evt.getKeyCode());
		}
	}			
);

Depois ele chama esse método que vai fazer tudo:

/**
 * Método responsável por realizar o controle total do KeyBoard para este componente.
 * 
 * @param	an_key
 * 		Tecla pressionada do usuário
 * 
 * OBS: A variavel ib_ctrl_pressed é iniciada de false.
*/
public
void		KeyExec(int an_key)
{
	//
	// Verifica a tecla que foi pressionada.
	//
	switch (an_key)
	{
		case			KeyEvent.VK_DOWN:
				
			//
			// Aciona a flag indicando que a tecla CTRL está solta.
			//
			ib_ctrl_pressed		=	false;
				
			//
			// Chama a função responsável por avançar uma pagina.
			//
			NextExec();
				
			break;
				
		case			KeyEvent.VK_UP:
				
			//
			// Aciona a flag indicando que a tecla CTRL está solta.
			//
			ib_ctrl_pressed		=	false;
				
			//
			// Chama a função responsável por voltar  uma pagina.
			//
			PreviousExec();
				
			break;
				
		case			KeyEvent.VK_CONTROL:
				
			//
			// Aciona a flag indicando que a tecla CTRL está pressionada.
			//
			ib_ctrl_pressed		=	true;
			
			break;
				
		case			KeyEvent.VK_S:
			
			//
			// Verifica se a tecla CTRL está pressionada.
			//
			if	(ib_ctrl_pressed)
			{
				//
				// Chama a função responsável por Salvar as alterações na base.
				//
				SaveExec();
			}
				
			//
			// Aciona a flag indicando que a tecla CTRL está solta.
			//
			ib_ctrl_pressed		=	false;
				
			break;
				
		case			KeyEvent.VK_A:
				
			//
			// Verifica se a tecla CTRL está pressionada.
			//
			if	(ib_ctrl_pressed)
			{
				//
				// Chama a função de adicionar uma pagina.
				//
				AddExec();
			}
				
			//
			// Aciona a flag indicando que a tecla CTRL está solta.
			//
			ib_ctrl_pressed		=	false;
				
			break;
				
		case			KeyEvent.VK_E:
				
			//
			// Verficia se a tecla CTRL está pressionada.
			//
			if	(
					ib_ctrl_pressed
				)
			{
				//
				// Chama a função de remover uma pagina.
				//
				RemoveExec();
			}
				
			break;
				
		default:
				
			//
			// Aciona a flag indicando que a tecla CTRL está solta.
			//
			ib_ctrl_pressed		=	false;
			
			break;
	}
}

Será que isso é uma maneira horrivel de programação?

Muito estranho não funcionar pois eu fiz aqui e funcionou perfeitamente... porem estava levelemente diferente :P

public class CtrlListener implements KeyListener {

	public void keyTyped(KeyEvent arg0) {
		if (arg0.getKeyCode() == KeyEvent.VK_S) {//Não estou mais usando "&&".Sera que foi isso ?
			if(arg0.getModifiers() == KeyEvent.CTRL_MASK){
				System.out.println("SALVA AQUI OH /o/");
			}
		}
	}

}
M

Comentario em tópico errado.
Desculpem.

M

Aqui o codigo exato que eu usei para testar:

package awt;

import java.awt.AWTEvent;
import java.awt.Toolkit;
import java.awt.event.AWTEventListener;
import java.awt.event.KeyEvent;

import javax.swing.JFrame;
import javax.swing.JPanel;

public class CaptureAllEvents extends JPanel {

	private static final long serialVersionUID = 4610230261671017623L;

	public CaptureAllEvents() {

		Toolkit.getDefaultToolkit().addAWTEventListener(new AWTEventListener() {
			public void eventDispatched(AWTEvent event) {

				KeyEvent ev = (KeyEvent) event;

				if (ev.getModifiers() == KeyEvent.CTRL_MASK) {
					if (ev.getKeyCode() == KeyEvent.VK_S) {
						System.out.println("salva");
					}
				}
			}
		}, AWTEvent.KEY_EVENT_MASK);
	}

	public static void main(String[] args) {
		JFrame frame = new JFrame();
		frame.setContentPane(new CaptureAllEvents());
		frame.setSize(300, 200);
		frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
		frame.setVisible(true);
	}
}
Z

Nossa!

Funcionou perfeito!!.. mas, você sabe pq ele entra no sysout 2 vezes ?

M

Desculpe,

Já que eu postei errado acima… vou falar uma saida para você.

Coloque este código:

//

// Faz a verificação se for um evento de tecla pressionada.

//

if	(

ev.getID()		==	KeyEvent.KEY_PRESSED

)

{

}

antes de fazer o isto:

KeyEvent ev = (KeyEvent) event;

Pronto… jogue o resto de sua codificação dentro do IF.

Z

FUNCIONOU! OBRIGADO A VCS 2!

Criado 28 de janeiro de 2009
Ultima resposta 29 de jan. de 2009
Respostas 12
Participantes 3