focusLost chamado milhores de vezes!

6 respostas
chun

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                   
    
}

6 Respostas

Luiz-SP

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…

chun

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…

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…

T

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

chun

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

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…

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

chun

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

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 ?

Criado 7 de novembro de 2006
Ultima resposta 7 de nov. de 2006
Respostas 6
Participantes 4