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…
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…
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
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