focusLost chamado milhores de vezes!

Fiz uma aplicação de teste para verificar um possivel Bug do Swing…

O evento FocusLost é chamado muitas vezes caso voce adicione um JOptionPane em alguma validação dentro do listner…

O Codigo esta abaixo… estarei eu fazendo algo de errado ?

DETALHE IMPORTANTE… no linux funciona … soh chama uma vez… no Windows… chama umas 4 vezes se vc apetar no “NO” do JOptionPane

Any help ?

/*
 * TestForm.java
 *
 * Created on 7 de Novembro de 2006, 13:54
 */

package demo;

import javax.swing.JOptionPane;

/**
 *
 * @author  Dyego Souza Dantas Leal
 */
public class TestForm extends javax.swing.JFrame {
    
    /** Creates new form TestForm */
    public TestForm() {
        initComponents();
    }
    
    /** This method is called from within the constructor to
     * initialize the form.
     * WARNING: Do NOT modify this code. The content of this method is
     * always regenerated by the Form Editor.
     */
    // <editor-fold defaultstate="collapsed" desc=" Generated Code ">                          
    private void initComponents() {
        jTextField1 = new javax.swing.JTextField();
        jTextField2 = new javax.swing.JTextField();

        setDefaultCloseOperation(javax.swing.WindowConstants.EXIT_ON_CLOSE);
        jTextField1.setText("jTextField1");
        jTextField1.addFocusListener(new java.awt.event.FocusAdapter() {
            public void focusLost(java.awt.event.FocusEvent evt) {
                jTextField1FocusLost(evt);
            }
        });

        jTextField2.setText("jTextField2");

        org.jdesktop.layout.GroupLayout layout = new org.jdesktop.layout.GroupLayout(getContentPane());
        getContentPane().setLayout(layout);
        layout.setHorizontalGroup(
            layout.createParallelGroup(org.jdesktop.layout.GroupLayout.LEADING)
            .add(org.jdesktop.layout.GroupLayout.TRAILING, layout.createSequentialGroup()
                .addContainerGap(104, Short.MAX_VALUE)
                .add(layout.createParallelGroup(org.jdesktop.layout.GroupLayout.TRAILING, false)
                    .add(org.jdesktop.layout.GroupLayout.LEADING, jTextField2)
                    .add(org.jdesktop.layout.GroupLayout.LEADING, jTextField1, org.jdesktop.layout.GroupLayout.DEFAULT_SIZE, 196, Short.MAX_VALUE))
                .add(100, 100, 100))
        );
        layout.setVerticalGroup(
            layout.createParallelGroup(org.jdesktop.layout.GroupLayout.LEADING)
            .add(org.jdesktop.layout.GroupLayout.TRAILING, layout.createSequentialGroup()
                .addContainerGap(132, Short.MAX_VALUE)
                .add(jTextField1, org.jdesktop.layout.GroupLayout.PREFERRED_SIZE, org.jdesktop.layout.GroupLayout.DEFAULT_SIZE, org.jdesktop.layout.GroupLayout.PREFERRED_SIZE)
                .addPreferredGap(org.jdesktop.layout.LayoutStyle.RELATED)
                .add(jTextField2, org.jdesktop.layout.GroupLayout.PREFERRED_SIZE, org.jdesktop.layout.GroupLayout.DEFAULT_SIZE, org.jdesktop.layout.GroupLayout.PREFERRED_SIZE)
                .add(124, 124, 124))
        );
        pack();
    }// </editor-fold>                        

    private void jTextField1FocusLost(java.awt.event.FocusEvent evt) {                                      
    
        
        if (JOptionPane.showConfirmDialog(getRootPane(),"Prosseguir ?") == 1) {
           jTextField1.requestFocus();
           return;
        }
        
        System.out.println("Ok... Foi !");
    }                                     
    
    /**
     * @param args the command line arguments
     */
    public static void main(String args[]) {
        java.awt.EventQueue.invokeLater(new Runnable() {
            public void run() {
                new TestForm().setVisible(true);
            }
        });
    }
    
    // Variables declaration - do not modify                     
    private javax.swing.JTextField jTextField1;
    private javax.swing.JTextField jTextField2;
    // End of variables declaration                   
    
}

Separa as coisas…cria uma classe só para ouvir…num curto muito o jeito do netbeans fazer essas coisas…quando vc executa ele lança alguma exception…

[quote=LuizClaudio]Separa as coisas…cria uma classe só para ouvir…num curto muito o jeito do netbeans fazer essas coisas…quando vc executa ele lança alguma exception…
[/quote]

Isso é só um teste… está separado no projeto principal… isso eh apenas um teste do (possivel) Bug…

Pega isso ae e roda no teu IDE que vai rodar na boa…

Você quer fazer uma validação de campo usando o evento focusLost?
a) focusLost é chamado também quando se minimiza o frame, e em outras situações. Portanto é um evento um pouco “ruim”. No caso do SWT é até um pouco pior.

b) Veja um exemplo onde o cara evita o problema usando uma mensagem em posição fixa da tela, em vez de usar um MessageBox.

http://www.java2s.com/Code/Java/Swing-Components/ValidatingOnFocusLostExample.htm

[quote=thingol]Você quer fazer uma validação de campo usando o evento focusLost?
a) focusLost é chamado também quando se minimiza o frame, e em outras situações. Portanto é um evento um pouco “ruim”. No caso do SWT é até um pouco pior.

b) Veja um exemplo onde o cara evita o problema usando uma mensagem em posição fixa da tela, em vez de usar um MessageBox.

http://www.java2s.com/Code/Java/Swing-Components/ValidatingOnFocusLostExample.htm
[/quote]

Preciso validar quando o cara sai do campo… nao tem outra forma se nao pelo focusLost…

No exemplo que voce passou o cara tah usando o framework de validação do jGoodies… e ele nao apresenta um JOptionPane pro cara… se eu tirar o JOptionPane tudo funciona numa boa…

Talvez no seu caso daria para usar InputVerifier em vez de FocusListener. Não sei se ele também está com os mesmos problemas citados pelo thingol.

Tem um exemplo aqui:
http://www.guj.com.br/posts/list/10483.java#154588

[quote=Sami Koivu]Talvez no seu caso daria para usar InputVerifier em vez de FocusListener. Não sei se ele também está com os mesmos problemas citados pelo thingol.

Tem um exemplo aqui:
http://www.guj.com.br/posts/list/10483.java#154588[/quote]

O problema do inputVerifier eh que se o usuario apertar o botao de “cancelar” da tela de cadastro mesmo assim ele vai chamar esse “evento” , coisa que no focusLost eu consigo detectar se o proximo componente a receber o foco é um BOTAO dae eu nao apresento a janela… saka ?