Pq o evento jFormattedTextField1.addFocusListener executa duas vezes?

3 respostas
G

vejam esse demo e me dizem, por favor, o q esta errado: quando sae de um foco, mostra primeiro o JOptionPane.showMessageDialog do campo q vai receber o foco, pra dae, mostrar o JOptionPane.showMessageDialog do q perdeu o foco (q eh soh o q eu estou precisando) ???

import javax.swing.JOptionPane;

public class teste extends javax.swing.JFrame {

    private javax.swing.JFormattedTextField jFormattedTextField1;
    private javax.swing.JFormattedTextField jFormattedTextField2;
    private javax.swing.JFormattedTextField jFormattedTextField3;

    public teste() {
        initComponents();
    }

    @SuppressWarnings("unchecked")
    private void initComponents() {

        jFormattedTextField1 = new javax.swing.JFormattedTextField();
        jFormattedTextField2 = new javax.swing.JFormattedTextField();
        jFormattedTextField3 = new javax.swing.JFormattedTextField();

        setDefaultCloseOperation(javax.swing.WindowConstants.EXIT_ON_CLOSE);

        jFormattedTextField1.setText("jFormattedTextField1");
        jFormattedTextField1.addFocusListener(new java.awt.event.FocusAdapter() {
            public void focusLost(java.awt.event.FocusEvent evt) {
                jFormattedTextField1FocusLost(evt);
            }
        });

        jFormattedTextField2.setText("jFormattedTextField2");
        jFormattedTextField2.addFocusListener(new java.awt.event.FocusAdapter() {
            public void focusLost(java.awt.event.FocusEvent evt) {
                jFormattedTextField2FocusLost(evt);
            }
        });

        jFormattedTextField3.setText("jFormattedTextField3");
        jFormattedTextField3.addFocusListener(new java.awt.event.FocusAdapter() {
            public void focusLost(java.awt.event.FocusEvent evt) {
                jFormattedTextField3FocusLost(evt);
            }
        });

    }

    private void jFormattedTextField1FocusLost(java.awt.event.FocusEvent evt) { 
         JOptionPane.showMessageDialog(null,"1");
    }                                              

    private void jFormattedTextField2FocusLost(java.awt.event.FocusEvent evt) {
        JOptionPane.showMessageDialog(null,"2");
    }

    private void jFormattedTextField3FocusLost(java.awt.event.FocusEvent evt) {
        JOptionPane.showMessageDialog(null,"3");
    }

    public static void main(String args[]) {
        java.awt.EventQueue.invokeLater(new Runnable() {
            public void run() {
                new teste().setVisible(true);
            }
        });
    }
}

agradeco quem ajudar: MUITO OBRIGADO !!!

3 Respostas

ViniGodoy

Geralmente, um dos eventos de perda de foco refere-se a uma perda temporária de foco. Perdas temporárias podem acontecer quando o componente está se validando, por exemplo. Para fazer isso, verifique se a propriedade isTemporary() do evento é true. Caso seja, descarte o processamento desse evento.

Geralmente ele só retornará false no momento que o foco realmente for perdido, e o outro componente ganhar foco (perda permanente de foco).

G

funcionou… blz… obrigado !!!

ViniGodoy

Outra situação de perda temporária de foco, que você acaba tratando “por tabela”, é quando a janela perde o foco.
O componente nessa janela perde junto, mas esse foco será restaurado a ele assim que a tabela voltar em foco.

Geralmente, você não precisa validar componentes nessa situação.

PS: Já que a dúvida foi resolvida, edite o seu tópico original e escreva [Resolvido] antes do título. Isso ajuda o resto do povo a saber que esse tópico não precisa ser respondido, e também orienta futuros usuários com problema de tópico sobre qual tópico ler com a resposta. :wink:

Criado 3 de setembro de 2009
Ultima resposta 3 de set. de 2009
Respostas 3
Participantes 2