Validar formulario em uma aplicação Swing

Galera to tentando fazer uma validação aki para uma aplicação minha onde tento fazer com que a cada campo que n esteja correto como por exemplo nome em branco ele me alerte to erro, mas não qnd eu for salvar o formulário e sim fazer a validação qnd eu tirar o foco do local ou qnd for fazer um preenchimento que eh obrigatório e não esta na seqüencia.

estou fazendo aki usando JTabbedPane, para separa o formulario da Jtable com os dados vindos do banco!!!

se alguem tiver alguma ideia de como posso fazer…

Obrigado!!!

  1. Use o JFormattedTextField para os textos com formatação (numéricos, por exemplo);
  2. Use um InputVerifier para os textos sem formato fixo, mas com regras;
  3. No JTable, impeça que seu TableModel aceite valores inválidos. Basta não confirma-los no setValueAt. Outra possibilidade é definir CellEditors personalizados para facilitar a entrada;
  4. JComboBoxes e JLists são chatas de tratar. Você precisará lidar com eventos.

Eu ainda acho a validação no botão de save muito melhor. O usuário pode inserir dados mais rapidamente no formulário, o código fica mais coeso, fácil de manter e não depende tanto do mecanismo de eventos. Pode ser disparado em outras situações, como ao fechar a janela e responder “sim” a perguntas como “você não salvou, deseja salvar agora?”.

Ao invés de dar erro e impedir sair do campo, uma boa alternativa é só pintá-lo de vermelho quando o usuário sair do componente. Isso faz com que a digitação ainda permaneça rápida.

como você quer fazer a validação no momento que o componente perder o foco… use o “focusLost”…
Com codigo do tipo:

private void jTextField1FocusLost(java.awt.event.FocusEvent evt) { /* verifica se o campos esta vazio */ if (jTextField1.getText().equals("")){ /* seta o background para vermelho */ jTextField1.setBackground(Color.RED); } else { /* seta o background para branco */ jTextField1.setBackground(Color.WHITE); } }
Que verifica se o campo esta vazio, e se verdadeiro pinta o BG de vermelho…
ainda existe a possibilidade de você definir um JLabel ao lado do seu edit, e alterar
o setIcon dele a metida que a inserção eh vista como certa ou errada… lembrando
validação Ajax (web) …
fica a ideia,

Abraço.

O focusLost não é adequado para JTextFields, mas pode ser usado para JList e JCombobox, que citei ali. Para o JTextField, use o InputVerifier, que foi criado justamente pq o focusLost apresentava muitos problemas.

Não sabia, dica furada então… shausuahs. :cry:

Abraço.

Ela serve para colorir o JTextField, como você fez, só não serve para “cancelar” a saída do JTextField.
Era aí que o evento falhava.

Sem falar que sua dica também serve para outros componentes.

Normalmente eu uso esse tipo de validação nas minhas aplicações, mas de fato não prendo o usuário no campo…
só faço “brincadeiras” de trocar cor, aviso textual dentro do campo, ou usando um label para exibir imagens de erro…

prender (obrigar) o preenchimento me parece meio chato… para isso você pode fazer o teste ao entrar no componente que
tem alguma dependência, e nesse momento verificar se os componentes necessarios estao preenchidos, se não…
troca o foco para os pre-requisitos…
ideia… ^^

Abraço.

Fiz dessa forma e mesclando com a forma q o fabio falo… mas so q qnd coloco no focus ele fica meio q em loop pelo fato da mensagem tirar o foco!!!

 public void validaCamposPreenchidos() {
        int j;
        if (nomeField.getText().length() <= 0) {
            Object[] options = {"OK"};
            j = JOptionPane.showOptionDialog(null, "Informe o Campo NOME", "Erro de validação",
                    JOptionPane.ERROR_MESSAGE, JOptionPane.QUESTION_MESSAGE, null, options, options[0]);
            if (j == JOptionPane.ERROR_MESSAGE) {
                nomeField.setBackground(Color.RED);
                jTabbedPane1.setSelectedIndex(1);
                nomeField.requestFocus();
                
            }

        } else {
             //Tratamento
        }
    }

Viu só como se você quiser manter o foco no JTextField não dá para usar o evento?

Use o InputVerifier, que eu citei ali em cima.

E se você deixar;

if (nomeField.getText().length() <= 0) { nomeField.setBackground(Color.RED); } else { //Tratamento }
no lost do nomeField e;

if (nomeField.getText().length() <= 0) { Object[] options = {"OK"}; j = JOptionPane.showOptionDialog(null, "Informe o Campo NOME", "Erro de validação", JOptionPane.ERROR_MESSAGE, JOptionPane.QUESTION_MESSAGE, null, options, options[0]); if (j == JOptionPane.ERROR_MESSAGE) { jTabbedPane1.setSelectedIndex(1); nomeField.requestFocus(); } } else { //Tratamento }
no gained de quem depende do nome?

e como usar o InputVerifier vini?

Você pode fazer inline assim:

nomeField.setInputVerifier(new InputVerifier() { public boolean verify(JComponent input) { JTextField txtNome = (JTextField) input; if (txtNome.getText().length() <= 0) { JOptionPane.showMessageDialog(SeuFrame.this, "Informe o campo NOME!", "Erro de validação!", JOptionPane.ERROR_MESSAGE); return false; } return true; } });

Ou, como no caso vai ser comum verificar por coisas em branco, é melhor criar uma classe:

[code]nomeField.setInputVerifier(new BlankVerifier(“NOME”));

class BlankVerifier extends InputVerifier {
private String fieldName;
public BlankVerifier(String fieldName) {
this.fieldName = fieldName;
}

public boolean verify(JComponent input) {
JTextComponent txtField = (JTextField) JTextComponent;
if (txtField.getText().length() <= 0) {
JOptionPane.showMessageDialog(SeuFrame.this, "Informe o campo " + fieldName + “!”,
“Erro de validação!”, JOptionPane.ERROR_MESSAGE);
return false;
}
return true;
}
}
[/code]

Tinha um exemplo detalhado e funcional no link que postei.

Vejam que com o inputVerifier nem sequer é necessário chamar o requestFocus().
Ele mesmo proíbe o JTextField de perder o foco, caso o método verify() retorne false.

Sem falar que é mais simples do que o tratamento no evento.

Vini tem algum exemplo bem legal ai pra o uso do InputVerifier???

att!!!

Não serve os do link, ou os que eu dei? :shock:

To tentando testar com esse exemplo aki as n ta rodando n

nomeField.setInputVerifier(new InputVerifier() ){  
   public boolean verify(JComponent input) {  
      JTextField txtNome = (JTextField) input;  
      if (txtNome.getText().length() <= 0) {  
          JOptionPane.showMessageDialog(SeuFrame.this, "Informe o campo NOME!", "Erro de validação!", JOptionPane.ERROR_MESSAGE);  
          return false;  
      }  
      return true;  
    }  
}  

E dá algum erro?

Você tentou corrigir? Eu não tenho o netbeans aqui para testar, então faço o código mais ou menos, vc tem que arrumar!

Acabei de ver que vc fechou um parênteses a mais depois do new InputVerifier()

Eh fechei mas n era esse o problema…

esta em toda a lnha

Cara, diz a mensagem de erro, senão fica exotérico demais para corrigir.

Teste aí:

nomeField.setInputVerifier(new InputVerifier() { public boolean verify(JComponent input) { JTextField txtNome = (JTextField) input; if (txtNome.getText().length() <= 0) { JOptionPane.showMessageDialog(null, "Informe o campo NOME!", "Erro de validação!", JOptionPane.ERROR_MESSAGE); return false; } return true; } });