Dúvida sobre manipular o foco na saída do TextField

Tenho esse trecho de código onde preciso que a regra é, se eu digitar 3 ou menos
caracteres ele retorna para a TextField. Só que emito uma mensagem
para o usuário. O Problema:

A mensagem aparece mais que uma vez antes de voltar para a TextField, muito incomodo essa situação.
Detalhe, existe outra forma de controlar isso, diferente da que eu estou tentando?

tfNome.addFocusListener(new FocusAdapter() { public void focusLost(FocusEvent e) { //adicionar sua verificação aqui if(tfNome.getText().length()< 4) JOptionPane.showMessageDialog(null, "Aceita acima de 2 caracteres"); tfNome.setText(""); tfNome.grabFocus(); } });

Agradeço a atenção dos colegas. :wink:

Olá,

Aqui não apareceu não, somente uma vez a mensagem.

Você tem outro Listener nesse objeto tfNome ?

[quote=HenriqueBR]Olá,

Aqui não apareceu não, somente uma vez a mensagem.

Você tem outro Listener nesse objeto tfNome ?[/quote]

Sim tenho mais que um Listener. Mas valeu a ajuda, achei um jeito, inclusive que força o usuário a digitar o Nome que é necessário.

tfNome.addFocusListener(new FocusAdapter() { public void focusLost(FocusEvent e) { //adicionar sua verificação aqui if(tfNome.getText().length()< 4 && tfNome.getText().length() != 0) JOptionPane.showMessageDialog(null, "Aceita acima de 3 caracteres"); tfNome.setText(""); tfNome.grabFocus(); } });

[quote=Armando Pereira][quote=HenriqueBR]Olá,

Aqui não apareceu não, somente uma vez a mensagem.

Você tem outro Listener nesse objeto tfNome ?[/quote]

Sim tenho mais que um Listener. Mas valeu a ajuda, achei um jeito, inclusive que força o usuário a digitar o Nome que é necessário.

tfNome.addFocusListener(new FocusAdapter() { public void focusLost(FocusEvent e) { //adicionar sua verificação aqui if(tfNome.getText().length()< 4 && tfNome.getText().length() != 0) JOptionPane.showMessageDialog(null, "Aceita acima de 3 caracteres"); tfNome.setText(""); tfNome.grabFocus(); } }); [/quote]

Nossa, tô ficando xarope, não deu certo não…
Realmente o outro Listener atrapalha :?

[quote=Armando Pereira][quote=Armando Pereira][quote=HenriqueBR]Olá,

Aqui não apareceu não, somente uma vez a mensagem.

Você tem outro Listener nesse objeto tfNome ?[/quote]

Sim tenho mais que um Listener. Mas valeu a ajuda, achei um jeito, inclusive que força o usuário a digitar o Nome que é necessário.

tfNome.addFocusListener(new FocusAdapter() { public void focusLost(FocusEvent e) { //adicionar sua verificação aqui if(tfNome.getText().length()< 4 && tfNome.getText().length() != 0) JOptionPane.showMessageDialog(null, "Aceita acima de 3 caracteres"); tfNome.setText(""); tfNome.grabFocus(); } }); [/quote]

Nossa, tô ficando xarope, não deu certo não…
Realmente o outro Listener atrapalha :? [/quote]

Henrrique, tenho outros Listener, mas ainda não tenho para o mesmo objeto. Então, por que acontece essa repetição de mensagem?

Não use eventos para tratar isso. Prefira um InputVerifier:
http://docs.oracle.com/javase/7/docs/api/javax/swing/InputVerifier.html

     class LengthVerifier extends InputVerifier {
         public boolean verify(JComponent input) {
             JTextField tf = (JTextField) input;
             return tf.getText().lenght() == 3;
         }
     }

Uso:

seuTextField.setInputVerifier(new LenghtVerifier());