Problema com KeyListener

Olá,

Meu problema é o seguinte: adicionei um KeyListener a um textfield da seguinte forma:

jFormattedTextField1.addKeyListener( new java.awt.event.KeyListener() {

			public void keyPressed(KeyEvent arg0) { }

			public void keyReleased(KeyEvent arg0) {
				if( arg0.getKeyCode() == 10 ) // tecla enter
				{
					jButton1.doClick();
				}
				
			}

			public void keyTyped(KeyEvent arg0) { }
        	
        }
        );

Porém, no meu jButton eu chamo um JOptionPane com uma mensagem, caso o usuário não passe um inteiro válido no text field.

Quando aperto enter para ativar o “OK” do JOptionPane, dispara um outro evento que acaba chamando de novo o JOptionPane, entrando assim em loop.

Devo necessariamente utilizar o enter, pois o usuário vai utilizar o teclado numérico para entrar com os dados, e fica mais fácil apertar o enter… é uma questão de usabilidade.

Alguém saberia como contornar esse problema? Já tentei adicionar o key listener ao botão, mas deu o mesmo problema…

Agradeço desde já.

Da uma olhada neste exemplo

addKeyListener(new KeyListener(){ public void keyPressed(KeyEvent e){ int code = e.getKeyCode(); if (code == KeyEvent.VK_ENTER){ //codigo } } public void keyTyped(KeyEvent arg0) { } public void keyReleased(KeyEvent arg0) { } });

humm, agora q vi que ta quase igual. Esta certo o seu código, posta o codigo do button.doClick

Primeira pergunta:

porque o uso disso jButton1.doClick(); dentro do Released ?

Sugestão (se eu entendi direito):

colocar no lugar de jButton1.doClick(), o JOptionPane informando…

ficando:

public void keyReleased(KeyEvent arg0) { if( arg0.getKeyCode() == 10 ) // tecla enter { JOptionPane.showMessageDialog(null,"Blablablablablabla"); } }

é isso?

Tchauzin!

Mesmo colocando o JOptionPane dentro do KeyReleased não dá certo, é gerado um evento de tecla quando aperto enter… o que preciso fazer é consumir esse enter…

Coisas simples ficam complexas com Swing :slight_smile:

Para felicidade geral da nação descobri o problema:

Não utilizem o métod keyReleased, e sim o keyPressed. Dessa forma o enter do JOptionPane é consumido e volta para o textfield sem lançar um novo evento :slight_smile:

Ae muleque!

É como eu digo: procure entender e ler bastante a API Swing, antes de sair usando ela e reclamando, diznedo que é ruim…

nao senhor…
com o KeyPressed, ele nao funciona corretamente… =/
=D

pelo que entendi, vc quer chamar o evento do botão quando o usuário apertar a tecla enter no JTextField.

Acredito que a melhor maneira seja, adicionar um ActionListener no FormattedTextField1, desta maneira:

Fazendo com que a classe implemente ActionListener, assim:

public class NomeDaClasse … … implements ActionListener { … }

adicione o ActionListener no FormattedTextField1 após alocar o mesmo.

JFormattedTextField1.addActionListener(this); //para que ele ouça eventos do objeto em que se encontra.

e, por ultimo, implemente o método abstrato ActionPerformed para que o ActionListener tenha efeito.

public void actionPerformed(ActionEvent e) {

if ( e.getSource() == JFormattedTextField1 ) {
//código
}

}

Desta maneira, quando o usuário aperta a tecla enter com o foco no JFormattedTextField1, o evento ActionPerformed é disparado e ele executa o //código quando o disparador for o objeto JFormattedTextField1

Espero ter ajudado.