[RESOLVIDO] Como realizar uma validação de campos de cadastro - Java

Olá pessoal,

Eu preciso de muita ajuda na sequência lógica com o qual o meu código está sendo escrito. Eu estou fazendo uma tela de cadastro (normal, rsrs) e eu quero fazer uma validação dos campos do cadastro:

  • Se tem algum vazio > exibe mensagem “preencha todos os campos”;
  • Se o e-mail está em formato incorreto > exibe mensagem “e-mail inválido”;
  • Se a senha possui menos de 8 char > exibe mensagem “senha curta, minimo 8 chars”;
  • Se a confirmação da senha é igual a senha > exibe mensagem “senhas não são iguais.”;

Ok, essas são os tratamentos que ainda nem tem nada a ver com o banco de dados. O que eu preciso é de uma estrutura que responda a todas essas validações e então insira no banco de dados. Até o presente momento, a estrutura IF-ELSE que criei trata os campos mas está errado.
Por exemplo:

  • Se eu não digitar o e-mail corretamente e eu clicar em “Cadastrar”, ele irá mostrar “E-mail inválido” mas ainda assim vai inserir no banco de dados. O mesmo acontece para os outros campos.

Tudo isso está no evento de ação de um jButton (Estou usando o Swing) conforme visto abaixo:

private void btn_cadregistrarActionPerformed(java.awt.event.ActionEvent evt) {                                                 
    
    usuariosBO = new UsuariosBO();
          
    /* VALIDAÇÃO DE CADASTRO */
    // Campos vazios.
    if("".equals(f_cadsenha.getText()) || "".equals(f_cadsenha2.getText()) || "".equals(f_cadnome.getText()) || 
            "".equals(f_caduser.getText()) || "".equals(f_cademail.getText())){
        JOptionPane.showMessageDialog(null, "Preencha todos os campos");
        
        String email = f_cademail.getText().trim();
        
        //Expressão regular para validar
        Pattern p = Pattern.compile(".+@.+\\.[a-z]+");
        Matcher m = p.matcher(email);

        boolean matchFound = m.matches();
        // E-mail válido ou inválido.
        if(matchFound){
        }
        else{
        JOptionPane.showMessageDialog(null, "E-mail inválido. Digite o formato correto!");
        }
    }
    
    else{
        usuariosBO.insert(loadDTO());
        JOptionPane.showMessageDialog(null, "Cadastro realizado com sucesso!");
    }
    
}

Há também as validações de Senha e ConfirmaSenha que eu fiz no Evento de FocoLost do jTextField (Swing), isto é, segui a lógica que assim que o usuário digitasse a senha e tirasse o foco do campo jTextField (chamada de f_cadsenha) um IF-ELSE iria validar se o campo possui mais de 8 caracteres ou não. Veja abaixo:

private void f_cadsenhaFocusLost(java.awt.event.FocusEvent evt) {                                     
    
    if(f_cadsenha.getText().length() < 8){
        JOptionPane.showMessageDialog(null, "Sua senha deve conter no mínimo 8 caracteres.");
    }
    
}

E também há o campo para confirmação da senha digitada no campo anterior. Esse é um IF-ELSE comparando igualdade nos dados inseridos.

private void f_cadsenha2FocusLost(java.awt.event.FocusEvent evt) {                                      
    String senha = f_cadsenha.getText();
    String senha2 = f_cadsenha2.getText();
    
    if(senha.equals(senha2)){
    }
    else{
        JOptionPane.showMessageDialog(null, "Suas senhas não são iguais.");
    }
}

No geral, esse tipo de código gerou algumas inconveniências, como por exemplo que toda vez que o foco sai de um campo para preencher outro, abre o JOptionPane com o aviso da instrução.

Bom, é isso. Por favor me ajudem. Não estou pedindo pra me darem de bandeja, por favor, não! Mas gostaria muito que pudesse apresentar uma resposta bem explicada. Eu não conheço todos os termos do Java, mas me esforço.
Obrigado comunidade pela ajuda. Se precisarem de mais informações sobre o problema para ajudar a melhorar o entendimento na resposta, eu edito o post e marco.

Grato.

pelo que eu pude ver seu if apenas contempla campos vazios, se não tiver um campo vazio ele cai no else e cadastra o usuário.
Outra coisa que não é bem um problema, mas seria uma boa prática de programação e trocar o equals que você usa de posição. mudar
"".equals(f_cadsenha.getText()) por f_cadsenha.getText().equals(""), faz a mesma coisa, mas fica depois mais fácil se precisar de uma ajuda externa.
Caso o que eu disse não resolva seu problema, colocar o código completo e o método de validação do e-mail, pois isso foi a unica coisa que vi.

1 curtida

Olá @Heitor_Veloso, obrigado por comentar e ajudar :slight_smile:

Então… nessa mesma estrutura IF-ELSE, eu tenho esse código:

String email = f_cademail.getText().trim();
    
    //Expressão regular para validar
    Pattern p = Pattern.compile(".+@.+\\.[a-z]+");
    Matcher m = p.matcher(email);

    boolean matchFound = m.matches();
    // E-mail válido ou inválido.
    if(matchFound){
    }
    else{
    JOptionPane.showMessageDialog(null, "E-mail inválido. Digite o formato correto!");
    }

Viu essa parte também? Então, é ela que vê o campo do e-mail e diz se ele tem @, .com (Eu usei Expressão Regular por me falarem que é mais fácil, elegante e correto) .

Outro ponto que acabei esquecendo e que irei editar no post é sobre a instrução feita para ver os campos de “senha” e “confirma senha”. Dê uma olhada que eu já devo ter editado.

Obrigado

ao invés de usar um if…else, voce pode colocar o simbolo de exclamação antes do if, que quer dizer que se aquela condição NÃO for atendida que ele cai no if. Ficaria assim:

if(!(senha.equals(senha2))){
OptionPane.showMessageDialog(null, “Suas senhas não são iguais.”);
}

o problema do focusLost é que se o usuário quiser ignorar esses campos ele chega ao botão confirmar tranquilamente, pois só executa o focusLost se tiver ganhado foco antes, além de que só vai aparecer a mensagem para o usuário avisando que ele não fez como pedido, mas ele consegue deixar do mesmo jeito se quiser, tem 2 formas de resolver isso. A primeira é seguindo sua lógica é no evento focusLost no primeiro você da f_cadsenha.getFocus(); no segundo você da f_cadsenha2.getFocus(); o problema que acontece é que ele não consegue sair do JTextField em um primeiro momento até ter pelo menos 8 caracteres e do segundo até ser igual ao primeiro, mas se o primeiro for “”, ele só pode sair se deixar em branco. A outra opção que considero melhor, é quando o usuario clicar em confirmar que você vai fazer as validações, no primeiro JTextField que ele errar você da um .getFocus() nele e da um return; que ele não continua fazendo as comparações por exemplo:

if(f_cadsenha.getText().length() < 8){
        JOptionPane.showMessageDialog(null, "Sua senha deve conter no mínimo 8 caracteres.");
        f_cadsenha.getFocus();
        return;
    }
else if(!(senha.equals(senha2))){
      OptionPane.showMessageDialog(null, "Suas senhas não são iguais.");
       f_cadsenha2.getFocus();
       return;
}
usuariosBO.insert(loadDTO());
JOptionPane.showMessageDialog(null, "Cadastro realizado com sucesso!");

dando o return ele não chega no metodo inserir, então não precisa colocar ele em um else.

1 curtida

tem outros problemas como a pessoa copiar e colar de outro lugar, a pessoa colocar apenas espaço no campo, por isso o focusLost não é muito bom, tambem recomendo você trocar o campo JTextField por um do tipo Password, pois sempre que ele digitar vai aparecer apenas pontos e não terá a senha revelada para outros.

1 curtida

@Heitor_Veloso

Nossa! Valeu Heitor, estou reorganizando o código então para dentro dessas dicas. Exatamente isso que estava procurando.
É como você disse, o EventFocus é bom mas atrapalha e pode sim ser burlado. Eu não quero um cadastro 100% validado e tratado, somente nesses mesmo por serem os mais comuns. As regras como por exemplo: proibir colagem de texto no “ConfirmaSenha” nao vai ter, mas é só detalhe.

E claro, os campos de senha são jPassword, acabei falando sobre elas aqui como jTextField (erro meu :smile: ), e por serem Password, o getFocus() não é regular nele, mas aí é só usar o requestFocus.

Vou terminar as modificações segundo suas orientações e irei testar!

Obrigado pela ajuda e pela disposição!

Olha Louganhs, to vendo que você está começando, tenho algumas dicas para você que vai fazer você ter um código bem mais maduro e não é muito díficil de implementar.

No caso das sua validações de campo(vazios e outras coisas), você pode tratar isso com uma exepction, vai fazer mais sentido e vai deixar teu código like a boss.

exemplo: crie uma classe e faça ela herdar da classe Exception do java
public class RegraNegocioException extends Exception{
RegraNegocioException(String mensagem){
super(mensagem);
}
}

só isso ai;

agora no teu medoto de validação valide assim

try{
if(JTextFieldCampo().getText().equal(""))
throw new RegraNegocioException(“Preencha o campo tals”);

if(JTextFieldOutroCampo2().getText().equal(""))
throw new RegraNegocioException(“Preencha o campo tals”);

if(!JtextFieldSenha().getText().equals(JtextFieldSenha2.getText()))
throw new RegraNegocioException(“As senhas nao sao iguais”);

//aqui so chama o método de salvar
salvar();

//vai fazendo para todos os campos um a um;
//note que desse jeito vc consegui dizer exatamente qual campo está inválido
}catch(RegraNegocioException e){
Joptionpane.showMensagem(e.getMensagem());
}

oque acontece é que vai passar por todos os ifs, se entrar em algum o java irá lançar uma exception, a que voce mesmo fez, e isso vai cair no catch e mostrar a mensagem no JoptionPane caso nao caia em nenhum if simplesmente vai salvar.

qualquer duvida posta ai.

1 curtida

Olá @Fabioreis1415,

De igual modo à resposta do Heitor, eu consegui entender melhor meu problema e aplicar as soluções que me recomendaram. :slight_smile:
Consegui fazer com que ele parasse de ter esses bugs. Muito obrigado pelo tempo e paciência de me explicar.

Grato pela ajuda…