Message Dialog não fecha

Olá pessoal…

Estou fazendo a validação dos campos de meu form, da seguinte forma:

             txtNome.addFocusListener(new FocusAdapter() {  
	        public void focusLost(FocusEvent e) { 
	        	String conteudo = txtNome.getText();
	            if(conteudo.equals("")){JOptionPane.showMessageDialog(null, "Preencha o campo corretamente !!");txtNome.requestFocus();};
	        }  
	    });

Gostaria de saber por que não consigo fechar “de primeira” o meu dialog e obter o foco no componente, e sim somente clicando 4X.

                               Grato

Ahn?
Como está tentando fechar o JOptionPane?

    Olá...

    Simplesmente clicando no "OK"...

Silvio,

Nunca use “focusLost” para fazer uma validação. Java Swing não é VB nem Delphi. “focusLost” não funciona do jeito que você quer.

Repito: qualquer código que use focusLost e mostre uma mensagem vai funcionar errado. Não use focusLost a menos que você saiba o que está fazendo.

O correto é usar um InputVerifier.

Vou dar um exemplo abaixo, onde você vai ver a diferença de comportamento do jeito errado e do jeito certo.

package guj;

import java.awt.EventQueue;
import java.awt.GridBagConstraints;
import java.awt.GridBagLayout;
import java.awt.Insets;
import java.awt.event.FocusAdapter;
import java.awt.event.FocusEvent;

import javax.swing.InputVerifier;
import javax.swing.JButton;
import javax.swing.JComponent;
import javax.swing.JFrame;
import javax.swing.JLabel;
import javax.swing.JOptionPane;
import javax.swing.JPanel;
import javax.swing.JTextField;
import javax.swing.SwingUtilities;
import javax.swing.text.JTextComponent;


class CampoVazioInputVerifier extends InputVerifier {

    private String nomeCampo;

    public CampoVazioInputVerifier(String nomeCampo) {
        super();
        this.nomeCampo = nomeCampo;
    }

    @Override
    public boolean verify(JComponent input) {
        if (input instanceof JTextComponent) {
            if (((JTextComponent) input).getText().isEmpty()) {

                JOptionPane.showMessageDialog(SwingUtilities.getWindowAncestor(input), "Campo " + nomeCampo
                    + " não deve estar vazio!");
                return false;
            }
        }
        return true;
    }

}

public class ExemploValidacaoCampoVazio extends JFrame {
    private JLabel lblEndereco;
    private JLabel lblNome;
    private JLabel lblEndereo;
    private JLabel lblTelefone;
    private JTextField txtCodigoCliente;
    private JTextField txtNome;
    private JTextField txtEndereco;
    private JTextField txtTelefone;
    private JPanel panel;
    private JButton btnOk;
    private JButton btnCancelar;

    /**
     * Launch the application.
     */
    public static void main(String[] args) {
        EventQueue.invokeLater(new Runnable() {
            public void run() {
                try {
                    ExemploValidacaoCampoVazio frame = new ExemploValidacaoCampoVazio();
                    frame.setVisible(true);
                } catch (Exception e) {
                    e.printStackTrace();
                }
            }
        });
    }

    /**
     * Create the frame.
     */
    public ExemploValidacaoCampoVazio() {

        initComponents();
    }

    private void initComponents() {
        setTitle("Teste Validacao Campos Vazios");
        setBounds(100, 100, 450, 300);
        setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        GridBagLayout gridBagLayout = new GridBagLayout();
        gridBagLayout.columnWidths = new int[] {
            148, 0, 2
        };
        gridBagLayout.rowHeights = new int[] {
            0, 0, 0, 0, 0, 0
        };
        gridBagLayout.columnWeights = new double[] {
            1.0, 1.0, Double.MIN_VALUE
        };
        gridBagLayout.rowWeights = new double[] {
            0.0, 0.0, 0.0, 0.0, 1.0, Double.MIN_VALUE
        };
        getContentPane().setLayout(gridBagLayout);
        GridBagConstraints gbc_lblEndereco = new GridBagConstraints();
        gbc_lblEndereco.anchor = GridBagConstraints.EAST;
        gbc_lblEndereco.insets = new Insets(0, 0, 5, 5);
        gbc_lblEndereco.gridx = 0;
        gbc_lblEndereco.gridy = 0;
        getContentPane().add(getLblEndereco(), gbc_lblEndereco);
        GridBagConstraints gbc_txtCodigoCliente = new GridBagConstraints();
        gbc_txtCodigoCliente.insets = new Insets(0, 0, 5, 0);
        gbc_txtCodigoCliente.fill = GridBagConstraints.HORIZONTAL;
        gbc_txtCodigoCliente.gridx = 1;
        gbc_txtCodigoCliente.gridy = 0;
        getContentPane().add(getTxtCodigoCliente(), gbc_txtCodigoCliente);
        GridBagConstraints gbc_lblNome = new GridBagConstraints();
        gbc_lblNome.anchor = GridBagConstraints.EAST;
        gbc_lblNome.insets = new Insets(0, 0, 5, 5);
        gbc_lblNome.gridx = 0;
        gbc_lblNome.gridy = 1;
        getContentPane().add(getLblNome(), gbc_lblNome);
        GridBagConstraints gbc_txtNome = new GridBagConstraints();
        gbc_txtNome.insets = new Insets(0, 0, 5, 0);
        gbc_txtNome.fill = GridBagConstraints.HORIZONTAL;
        gbc_txtNome.gridx = 1;
        gbc_txtNome.gridy = 1;
        getContentPane().add(getTxtNome(), gbc_txtNome);
        GridBagConstraints gbc_lblEndereo = new GridBagConstraints();
        gbc_lblEndereo.anchor = GridBagConstraints.EAST;
        gbc_lblEndereo.insets = new Insets(0, 0, 5, 5);
        gbc_lblEndereo.gridx = 0;
        gbc_lblEndereo.gridy = 2;
        getContentPane().add(getLblEndereo(), gbc_lblEndereo);
        GridBagConstraints gbc_txtEndereco = new GridBagConstraints();
        gbc_txtEndereco.insets = new Insets(0, 0, 5, 0);
        gbc_txtEndereco.fill = GridBagConstraints.HORIZONTAL;
        gbc_txtEndereco.gridx = 1;
        gbc_txtEndereco.gridy = 2;
        getContentPane().add(getTxtEndereco(), gbc_txtEndereco);
        GridBagConstraints gbc_lblTelefone = new GridBagConstraints();
        gbc_lblTelefone.insets = new Insets(0, 0, 5, 5);
        gbc_lblTelefone.anchor = GridBagConstraints.EAST;
        gbc_lblTelefone.gridx = 0;
        gbc_lblTelefone.gridy = 3;
        getContentPane().add(getLblTelefone(), gbc_lblTelefone);
        GridBagConstraints gbc_txtTelefone = new GridBagConstraints();
        gbc_txtTelefone.insets = new Insets(0, 0, 5, 0);
        gbc_txtTelefone.fill = GridBagConstraints.HORIZONTAL;
        gbc_txtTelefone.gridx = 1;
        gbc_txtTelefone.gridy = 3;
        getContentPane().add(getTxtTelefone(), gbc_txtTelefone);
        GridBagConstraints gbc_panel = new GridBagConstraints();
        gbc_panel.gridwidth = 2;
        gbc_panel.insets = new Insets(0, 0, 0, 5);
        gbc_panel.fill = GridBagConstraints.BOTH;
        gbc_panel.gridx = 0;
        gbc_panel.gridy = 4;
        getContentPane().add(getPanel(), gbc_panel);
    }

    private JLabel getLblEndereco() {
        if (lblEndereco == null) {
            lblEndereco = new JLabel("C\u00F3digo do Cliente");
        }
        return lblEndereco;
    }

    private JLabel getLblNome() {
        if (lblNome == null) {
            lblNome = new JLabel("Nome");
        }
        return lblNome;
    }

    private JLabel getLblEndereo() {
        if (lblEndereo == null) {
            lblEndereo = new JLabel("Endere\u00E7o");
        }
        return lblEndereo;
    }

    private JLabel getLblTelefone() {
        if (lblTelefone == null) {
            lblTelefone = new JLabel("Telefone");
        }
        return lblTelefone;
    }

    private JTextField getTxtCodigoCliente() {
        if (txtCodigoCliente == null) {
            txtCodigoCliente = new JTextField();
            txtCodigoCliente.addFocusListener(new FocusAdapter() {
                @Override
                public void focusLost(FocusEvent e) {
                    // A maneira errada de checar se um campo está vazio - via focusLost
                    if (txtCodigoCliente.getText().isEmpty()) {
                        JOptionPane.showMessageDialog(ExemploValidacaoCampoVazio.this, "Não pode deixar o código de cliente vazio!");
                        txtCodigoCliente.requestFocusInWindow(); // note que isto não vai funcionar
                        // e ainda por cima vai ativar a validação do próximo campo, o que obviamente não está certo
                    }
                }
            });
            txtCodigoCliente.setColumns(10);
        }
        return txtCodigoCliente;
    }

    private JTextField getTxtNome() {
        if (txtNome == null) {
            txtNome = new JTextField();
            txtNome.setColumns(10);
            // Veja como é muito mais simples!!!
            txtNome.setInputVerifier(new CampoVazioInputVerifier("nome"));
        }
        return txtNome;
    }

    private JTextField getTxtEndereco() {
        if (txtEndereco == null) {
            txtEndereco = new JTextField();
            txtEndereco.setColumns(10);
        }
        return txtEndereco;
    }

    private JTextField getTxtTelefone() {
        if (txtTelefone == null) {
            txtTelefone = new JTextField();
            txtTelefone.setColumns(10);
        }
        return txtTelefone;
    }

    private JPanel getPanel() {
        if (panel == null) {
            panel = new JPanel();
            panel.add(getBtnOk());
            panel.add(getBtnCancelar());
        }
        return panel;
    }

    private JButton getBtnOk() {
        if (btnOk == null) {
            btnOk = new JButton("OK");
        }
        return btnOk;
    }

    private JButton getBtnCancelar() {
        if (btnCancelar == null) {
            btnCancelar = new JButton("Cancelar");
        }
        return btnCancelar;
    }
}

Valeu…funfou…estou fazendo assim :

   ...
   txtNome.setInputVerifier(new ValidacaoCampo());

   class ValidacaoCampo extends InputVerifier {
        public boolean verify(JComponent input) {
              JTextField tf = (JTextField) input;
              return "pass".equals(tf.getText());
        }
    }

Mas como poderei capturar o retorno do verify para apresentar o MessageDialog ?