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;
}
}