[RESOLVIDO]Filtrar caracteres em JTextField

4 respostas Resolvido
java
G

Estou com um pequeno problema para resolver, preciso fazer uma pequena validação de nome de Usuário, onde somente se pode aceitar caracteres Alfanuméricos (Aa~Zz/0~9), pontos (.), traços (-) e arroba (@) tratando corretamente caso seja inserido um caractere inválido, além de validar com o Banco de Dados para verificar se já existe. A validação com o banco eu consigo fazer tranquilamente, porém a filtragem de caracteres eu não estou conseguindo fazer, uso o seguinte método:

private void txtUsuarioKeyTyped(java.awt.event.KeyEvent evt) {                                    
        String caracteres = "AaBbCcDdEeFfGgHhIiJjKkLlMmNnOoPpQqRrSsTtUuVvWwXxYyZz0987654321.-@";
        if (!caracteres.contains(evt.getKeyChar() + "")) {
            /*evt.consume();*/
            lblVerifUsuario.setIcon(new ImageIcon(getClass().getResource("/br/com/octur/imagens/Icon_erro.png"))); //caso haja caractere inválido exibe esta imagem em um label
        } else {
            lblVerifUsuario.setIcon(new ImageIcon(getClass().getResource("/br/com/octur/imagens/Icon_ok.png"))); 
        }
    }

Acontece que quando eu digito mais de 2 caracteres ele exibe a imagem como se estivesse errado, mesmo digitando caracteres na lista dos permitidos. Queria uma luz no meio de toda essa escuridão, se alguém puder ajudar ficaria agradecido.

4 Respostas

B
Solucao aceita

Prezado creio que um bom caminho para solução seria por expressões regulares (regex), pesquisa no google o aqui mesmo no guj que tem muito material sobre assunto, segue trecho de codigo para valida email, retirdo do link http://www.guj.com.br/t/validar-email-do-usuario/138604

public static boolean validar(String email)
{
    boolean isEmailIdValid = false;
    if (email != null && email.length() > 0) {
        String expression = "^[\\w\\.-]+@([\\w\\-]+\\.)+[A-Z]{2,4}$";
        Pattern pattern = Pattern.compile(expression, Pattern.CASE_INSENSITIVE);
        Matcher matcher = pattern.matcher(email);
        if (matcher.matches()) {
            isEmailIdValid = true;
        }
    }
    return isEmailIdValid;
}
N

Safeguard é uma biblioteca que tem varias validações pré definas, e caso não tenha você pode criar a sua, ela é integrada com validações de persistência.

Exemplo de uso dela:

Check check = new SafeguardCheck();
String email_para_validar = "[email removido]";
    
boolean result =  check
                       .elementOf(email_para_validar, ParametroTipo.EMAIL)
                       .validate()
                       .hasError();

System.out.println(result);

Você pode usar o maven caso seja um projeto maven, ou baixar os jars idependentes:

Safeguard JAR
Caelum Stella JAR

Coloque os dois jars no seu classpath e só usar.

Para criar o seu próprio tipo de validação, você cria dois enuns, um vai implementar a Interface BasePattern e o outro BaseParam, no seu caso se não é um email que você quer validar seria algo como no exemplo abaixo:

public enum TipoPadrao implements BasePattern {
   
 MEU_TIPO(new String("[\\d\\s\\w\\-.@]+"));

    private String padrao;
    
    private TipoPadrao(String padrao){
      this.padrao = padrao;
    }
    
    @Override
    public String getPattern() {
      return padrao; 
    }
   
}



public enum TipoParam implements BaseParam {

    MEU_TIPO(new PatternValidator(TipoPadrao.MEU_TIPO));

    private Validator<String> tipo;
    
    private TipoParam(PatternValidator tipo){
        this.tipo = tipo;
    }
    
    @Override
    public Validator<String> getType() {
       return tipo;
    }
    
}


public static void main(String[] args) {

        Check check = new SafeguardCheck();
        String texto_para_validar = "1gil 67.@";

        boolean result = check
                .elementOf(texto_para_validar, TipoParam.MEU_TIPO)
                .validate()
                .hasError();

        System.out.println(result);

    }
G

Obrigado, consegui fazer o método para validar o usuário usando as regex.

Eu estava procurando algo mais independente de bibliotecas externas, pois estou treinando para uma competição onde não conseguirei obtê-la. Mas seu código foi bastante útil e ajudou a achar a resposta, porem vou marcar a resposta do @Bituba como resolução pois foi com ela que eu achei o caminho para resolver. Muito Obrigado!

G

Código final para aqueles que tiverem a mesma dúvida.

Método para validar:

private boolean validaUser(String texto) {
        boolean usuarioValido = false;
        String expression = "[\\d\\s\\w\\-.@]+";

        String nome = texto;
        usuarioValido = nome.matches(expression);

        return usuarioValido;
    }

Evento do JTextField:

private void txtUsuarioKeyReleased(java.awt.event.KeyEvent evt) {                                       
        if (txtUsuario.getText().length() > 0) {
            if (validaUser(txtUsuario.getText())) {
                lblVerifUsuario.setIcon(new ImageIcon(getClass().getResource("/br/com/octur/imagens/Icon_ok.png")));
            } else {
                lblVerifUsuario.setIcon(new ImageIcon(getClass().getResource("/br/com/octur/imagens/Icon_erro.png")));
            }
        }
    }
Criado 18 de agosto de 2017
Ultima resposta 18 de ago. de 2017
Respostas 4
Participantes 3