Como limitar caracteres especiais em um JTextField?

Galera, minha situação é a seguinte, estou desenvolvendo uma aplicação swing na qual o cliente me pediu que o usuário não pudesse utilizar os caracteres especiais para preencher os campos na tela, ou seja, somente seriam permitidos letras e números, consegui fazer isso verificando por meio de regex antes de enviar pro banco de dados, porém, o cliente quer que no momento da digitação o sistema bloqueie o caracter especial ou caso seja, por exemplo, ‘Ç’ o sistema converta para ‘C’, então veio a idéia de criar um componente que:

  • eu possa bloquear, por meio de propriedades, caracteres especiais.
  • limitar o número de caracteres digitados.
  • permitir apenas letras.
  • permitir apenas números (inteiros ou valor monetário).
  • permitir letras e números.
    Então fica a pergunta, como posso fazer isso no java swing? Estou usando o Netbeans 7.2.1.

Desde já agradeço a ajuda.

Bambatera,

segue algumas coisas que você pode fazer:
Usuar o evento key typed para dentro do JTextField e dentro desse evento você controlar o que você quer fazer.

att

Nilson

[quote=Bambatera]

  • eu possa bloquear, por meio de propriedades, caracteres especiais.
  • limitar o número de caracteres digitados.
  • permitir apenas letras.
  • permitir apenas números (inteiros ou valor monetário).
  • permitir letras e números.[/quote]

Você pode criar um DocumentListener. KeyTyped é um evento notoriamente difícil de usar em um JTextField.

Acho que ele não quis dizer um DocumentListener, e sim um Document. Veja o javadoc do JTextField para ver como é que se cria um Document. http://docs.oracle.com/javase/6/docs/api/javax/swing/JTextField.html

Galera, resolvi o problema, criei um PlainDocument e coloquei JTextField.
Olha como ficou:

public class CustomDocument extends PlainDocument {

    private int pintMaxLength = 0;
    private boolean pblnUpperCase = false;
    private boolean pblnSpecialChar = true;
    private boolean pblnAllowNumbers = true;
    private boolean pblnAllowFloat = true;
    private boolean pblnAllowLetters = true;
    private boolean pblnAllowSpaces = true;

    /**
     * Contrutor do <tt>PlainDocument</tt>.
     * 
     * @param maxLength Tamanho máximo permitido no campo.
     * @param upperCase <tt>true</tt> coloca a string digitada em caixa alta, <tt>false</tt> permance como está.
     * @param specialChars <tt>true</tt> permite a digitação de caracteres especiais, <tt>false</tt> não permite.
     * @param allowNumbers <tt>true</tt> permite a digitação de números, <tt>false</tt> não permite.
     * @param allowFloat <tt>true</tt> permite a digitação de valores monentários, <tt>false</tt> não permite.
     * @param allowLetters <tt>true</tt> permite a digitação de letras, <tt>false</tt> não permite.
     * @param allowSpaces <tt>true</tt> permite a digitação de espaços, <tt>false</tt> não permite.
     */
    public CustomDocument(int maxLength, boolean upperCase, boolean specialChars, boolean allowNumbers, boolean allowFloat, boolean allowLetters, boolean allowSpaces) {
        super();
        pintMaxLength = maxLength;
        pblnUpperCase = upperCase;
        pblnSpecialChar = specialChars;
        pblnAllowNumbers = allowNumbers;
        pblnAllowFloat = allowFloat;
        pblnAllowLetters = allowLetters;
        pblnAllowSpaces = allowSpaces;
    }

    @Override
    public void insertString(int offs, String str, AttributeSet att) throws BadLocationException {

        str = removeAcentos(str);

        if (pblnUpperCase) {
            str = str.toUpperCase();
        }

        if (pintMaxLength <= 0 && pblnSpecialChar && pblnAllowNumbers && pblnAllowFloat && pblnAllowLetters && pblnAllowSpaces) {
            super.insertString(offs, str, att);
            return;
        }

        if (!pblnSpecialChar && pblnAllowNumbers && pblnAllowLetters && pblnAllowSpaces) {
            Pattern p = Pattern.compile("^[a-zA-Z0-9\\s]+$");
            Matcher m = p.matcher(str);
            if (!m.matches()) {
                return;
            }
        }

        if (!pblnSpecialChar && !pblnAllowNumbers && pblnAllowLetters && pblnAllowSpaces) {
            Pattern p = Pattern.compile("^[a-zA-Z\\s]+$");
            Matcher m = p.matcher(str);
            if (!m.matches()) {
                return;
            }
        }

        if (!pblnSpecialChar && !pblnAllowNumbers && pblnAllowLetters && !pblnAllowSpaces) {
            Pattern p = Pattern.compile("^[a-zA-Z]+$");
            Matcher m = p.matcher(str);
            if (!m.matches()) {
                return;
            }
        }

        if (!pblnSpecialChar && pblnAllowNumbers && !pblnAllowLetters && !pblnAllowSpaces && !pblnAllowFloat) {
            Pattern p = Pattern.compile("^[0-9]+$");
            Matcher m = p.matcher(str);
            if (!m.matches()) {
                return;
            }
        }

        if (!pblnSpecialChar && pblnAllowNumbers && !pblnAllowLetters && pblnAllowSpaces && !pblnAllowFloat) {
            Pattern p = Pattern.compile("^[0-9\\s]+$");
            Matcher m = p.matcher(str);
            if (!m.matches()) {
                return;
            }
        }

        if (!pblnSpecialChar && pblnAllowNumbers && !pblnAllowLetters && !pblnAllowSpaces & pblnAllowFloat) {
            Pattern p = Pattern.compile("^/[0-9]|\\,/");
            Matcher m = p.matcher(str);
            if (!m.matches()) {
                return;
            }
        }

        int intLen = getLength() + str.length();
        if (intLen > pintMaxLength) {
            return;
        }

        super.insertString(offs, str, att);
    }

    /**
     * Remove acentos de uma string passada como parâmetro.
     *
     * @param str String na qual serão removidos os acentos.
     * @return String limpa, ou seja, sem acentos.
     */
    private String removeAcentos(String str) {
        String strTexto;
        strTexto = Normalizer.normalize(str, Normalizer.Form.NFD);
        strTexto = strTexto.replaceAll("[^\\p{ASCII}]", "");
        return strTexto;
    }

Não ficou exatamente como eu queria, mas já resolveu boa parte do meu problema.

Valeu pelas dicas.