[RESOLVIDO]Filtrar caracteres em JTextField

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.

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

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 = "teste@teste.com";
    
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);

    }
1 curtida

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!

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