FocusLost executar uma unica vez

10 respostas
william_sistema

Fala Galera

estou fazendo uma validação de cnpj. então uso a opção FocusLost
O problema apareceu quando o usuário coloca um valor errado. Coloquei um JOptionPane para avisar o usuário que o valor digitado está incorreto, então utilizo um requestFocus() mas não consigo passar o focus para o JTextField que teve problema assim que dou “OK” no JOptionPane…

O que eu fiz funciona, mas muuiito mal!
Ao invez do JOptionPane aparecer uma única vez ele aparece 4!

10 Respostas

renanedpedroso

Você vai ter que remover seu listener antes de exibir o seu JOptionPane e depois que voltar, você o adidiona novamente.

william_sistema

Caro…

desculpa minha ignorancia no assunto, mais não sei como fazer isso, vc poderia me postar um exemplo por favor?

agradeço muito a atenção.

renanedpedroso

Tente isso…

Eu encontrei essa maneira para resolver seu problema, pode ser que exista outra maneira de resolver.

FocusListener listener = new FocusListener() {

   public void focusGained(FocusEvent e) {

   }

   public void focusLost(FocusEvent e) {
        ((Component)e.getSource()).removeFocusListener(this);
        JOptionPane.showMessageDialog(null, "Teste");
        ((Component)e.getSource()).addFocusListener(this);
    }
};

campoTexto.addFocusListener(listener);

Espero ter ajudado.

Abraço!

william_sistema

meu caro
no caso estou usando focuslost

agora com este código que passou eu deveria usar outra propriedade?

renanedpedroso

O que você quer dizer com outra propriedade?

No meu código também estou usando o focusLost.

william_sistema

me espressei mal…

me refiro a esta linha

campoTexto.addFocusListener(listener);

ele deve ser usada em baixo do focusLost ou tepra uma propriedade para colocar ela.

renanedpedroso

Para fazer o que você quer, eu imagino que você terá que criar uma classe que herde seu campo de texto e assim você pode tratar o listener como uma ‘propriedade’.

william_sistema

caro estou fazendo assim.

private void ftcCnpjFocusLost(java.awt.event.FocusEvent evt) {
        if (!ftcCnpj.getText().equals("")) {
            if (ftcCnpj.getText().length() >= 14) {
                try {
                    Cnpj cnpj;
                    cnpj = new Cnpj(ftcCnpj.getText());
                    if  (!cnpj.isCnpj() || !cnpj.isValid()) {
                        JOptionPane.showMessageDialog(null, "CNPJ incorreto, Por favor, verifique.", "ERRO", JOptionPane.ERROR_MESSAGE);
                    }
                } catch (ValidationException ex) {
                    Logger.getLogger(FornecedorDetalhe.class.getName()).log(Level.SEVERE, null, ex);
                }
            } else {
                
                //JOptionPane.showMessageDialog(null, "Teste");
                ((Component)evt.getSource()).removeFocusListener((FocusListener) this);

                JOptionPane.showMessageDialog(null, "CNPJ incorreto, Por favor, verifique.", "ERRO", JOptionPane.ERROR_MESSAGE);

                ((Component)evt.getSource()).addFocusListener((FocusListener) this);
         
            }
        }
    }

usei parte do seu código só que agora ele não mostra o JOptionPane

teria alguma coisa errada no código?

renanedpedroso

Troque as linhas:

((Component)evt.getSource()).removeFocusListener((FocusListener) this);  
  
                JOptionPane.showMessageDialog(null, "CNPJ incorreto, Por favor, verifique.", "ERRO", JOptionPane.ERROR_MESSAGE);  
  
                ((Component)evt.getSource()).addFocusListener((FocusListener) this);

para:

((Component) evt.getSource()).removeFocusListener((FocusListener) evt.getSource());

            JOptionPane.showMessageDialog(null, "CNPJ incorreto, Por favor, verifique.", "ERRO", JOptionPane.ERROR_MESSAGE);

            ((Component) evt.getSource()).addFocusListener((FocusListener) evt.getSource());

Espero ter ajudado.

Abraço!

william_sistema

meu caro agradeço muito a sua atenção mais ainda não consegui fazer funcionar como quero.

agora nã aparece a menssagem.

para facilitar, preciso que ao sair do compo o cnpj seja validade, caso esteja com erro ele me da uma menssagem e volta novamente para o campo.

mesmo se não usar focuslost, mais se funcionar como preciso já esta otimo tem outra maneira de fazer isto?

agradeço mais uma vezsua atenção.

Criado 29 de março de 2010
Ultima resposta 29 de mar. de 2010
Respostas 10
Participantes 2