JTextfield sem acentos e caracteres especiais

Pessoal, como posso determinar que meu jtextfield naum insira acentos e caracteres especiais? app java!

Essa restrição deve ser implementada em um Document.

Você pode estender a classe PlainDocument e implementar o método insertString para apagar os caracteres que não interessarem. Segue um exemplo:

[code]public class NumberDocument extends PlainDocument {

@Override
public void insertString(int offs, String str, AttributeSet a)
        throws BadLocationException {
    
    if (str == null) {
        return;
    }

    String accepted = str.replaceAll("[^0-9]", ""); // aqui apago os caracteres que não sejam números, assim mantenho apenas os números na String de entrada (representada pela variável str).

     super.insertString(offs, accepted, a); // chamo o método de PlainDocument, que vai exibir no text field apenas os caracteres que passaram pelo "filtro" acima.
}

}[/code]Este exemplo permite apenas que números sejam digitados no text field. Basta adaptá-lo passando uma expressão regular que bata com sua necessidade no método replaceAll.

Em seguida deve setar o novo Document no text field:

txtSeuCampo.setDocument(new NumberDocument());

[edit]a explicação a cima esta melhor[/edit]

No caso só aceite caracteres de a-Z e 0-9 e remover os demais

assim

JTextField campo = new JTextfield(); campo.getDocument().addDocumentListener(new DocumentListener { public void insertUpdate(DocumentEvent e) { campo.setText(campo.getText().replaceAll("[^a-zA-Z0-9]", "")); } public void removeUpdate(DocumentEvent e) { //não faz nada } public void changedUpdate(DocumentEvent e) { //não faz nada } );

Não testei mas deve funcionar!

Até!

uma parte do meu codigo

tbm uma boa forma de fazer e simples!

[code]public class JTextFieldFilter extends PlainDocument {

private static final long serialVersionUID = 7849760310991654101L;

/* TIPOS GENÉRICOS */
public static final String LOWERCASE = "abcdefghijklmnopqrstuvwxyz ";
public static final String UPPERCASE = "ABCDEFGHIJKLMNOPQRSTUVWXYZ ";
public static final String UPPERCASE_NO_SPACE = "ABCDEFGHIJKLMNOPQRSTUVWXYZ";
    
public static final String LOWERCASE_SPECIAL = "áâéíõúçãàêóôü";
public static final String UPPERCASE_SPECIAL = "ÁÂÉÍÕÚÇÃÀÊÓÔÜ";

public static final String ALPHA = LOWERCASE + UPPERCASE; 
public static final String NUMERIC = "0123456789";
public static final String DECIMAL = NUMERIC + "," + ".";

public static final String PONTO = ".";
public static final String UPPERCASE_NUMERIC_PONTO = UPPERCASE + NUMERIC + PONTO;

public static final String UPPERCASE_NUMERIC = UPPERCASE + NUMERIC;
public static final String UPPERCASE_NUMERIC_NO_SPACE = UPPERCASE_NO_SPACE + NUMERIC;
public static final String LOWERCASE_NUMERIC = LOWERCASE + NUMERIC;

public static final String ALPHA_NUMERIC = ALPHA + NUMERIC;
public static final String ALPHA_NUMERIC_UPPERCASE = UPPERCASE + NUMERIC;

private static final String SPECIAL = "ºª";

public static final String ENDERECO = UPPERCASE.trim() + DECIMAL + LOWERCASE;

public static String FULL = ALPHA_NUMERIC + LOWERCASE_SPECIAL + UPPERCASE_SPECIAL + SPECIAL;

/* TIPOS PRÉ DEFINIDOS */
public static final String DATE = NUMERIC + "/";
public static final String CEP = NUMERIC + "-";
public static final String EMAIL = "abcdefghijklmnopqrstuvwxyz" +  NUMERIC + "_@-.+";[/code]

Acho que o pessoal já falou tudo se tiver mais alguma dúvida posta aí, se não coloca o “RESOLVIDO” no tópico =D

bom, acredito que naum preciso modificar o jtextfield, so preciso saber como usar o "replaceall" , tipo se digito josé , ele substitiu o é por e , desculpe pessoal , pedi ajuda de forma errada, mas de qualquer forma, o que eu naum estou conseguindo fazer e , e usar o replaceall , exemplo: quando uso esse codigo abaixo:

variavel.getText().replaceAll("é", "e"); e digito josé ele substitui é, certo, eu quero fazer um conjuto com as vogais a ,e , i , o , u , todas elas acentuadas e com os caracteres especiais para substitui-los , exemplo: se digito joão josé/joão maria, ele ira substiuir o “ã” por “a”, e o “é” por “e” e a barra por espaço , acho que ficou claro! me deem uma força ai pessoa!

agradeço desde já!

bom, acredito que naum preciso modificar o jtextfield, so preciso saber como usar o "replaceall" , tipo se digito josé , ele substitiu o é por e , desculpe pessoal , pedi ajuda de forma errada, mas de qualquer forma, o que eu naum estou conseguindo fazer e , e usar o replaceall , exemplo: quando uso esse codigo abaixo:

variavel.getText().replaceAll("é", "e"); e digito josé ele substitui é, certo, eu quero fazer um conjuto com as vogais a ,e , i , o , u , todas elas acentuadas e com os caracteres especiais para substitui-los , exemplo: se digito joão josé/joão maria, ele ira substiuir o “ã” por “a”, e o “é” por “e” e a barra por espaço , acho que ficou claro! me deem uma força ai pessoa!

agradeço desde já!![/quote]

bom, acredito que naum preciso modificar o jtextfield, so preciso saber como usar o "replaceall" , tipo se digito josé , ele substitiu o é por e , desculpe pessoal , pedi ajuda de forma errada, mas de qualquer forma, o que eu naum estou conseguindo fazer e , e usar o replaceall , exemplo: quando uso esse codigo abaixo:

variavel.getText().replaceAll("é", "e"); e digito josé ele substitui é, certo, eu quero fazer um conjuto com as vogais a ,e , i , o , u , todas elas acentuadas e com os caracteres especiais para substitui-los , exemplo: se digito joão josé/joão maria, ele ira substiuir o “ã” por “a”, e o “é” por “e” e a barra por espaço , acho que ficou claro! me deem uma força ai pessoa!

agradeço desde já!![/quote][/quote]

Não precisa ficar dando tanto up no tópico assim.

O text field realmente não precisa ser modificado, assim como não foi em nenhum dos exemplos que foram passados. A implementação foi feita no Document, que funciona como se fosse o model dos text components, e o método insertString é o responsável por inserir conteúdo no text field. É comum ver validação em text field sendo feita em eventos, como KeyListener por exemplo. Mas isso pode gerar problemas, por isso que existem classes como InputVerifier ou até mesmo o Document. Então aconselho usar o Document mesmo para executar este trabalho.

Quanto a questão de remover acentos, isso pode ser conseguido com java.text.Normalizer. Segue o exemplo já com Document:

[code]public class UnaccentedDocument extends PlainDocument {
@Override
public void insertString(int offs, String str, AttributeSet a)
throws BadLocationException {

    if (str == null) {
        return;
    }

    String unaccented = Normalizer.normalize(str, Normalizer.Form.NFD); // elimina os acentos.
    unaccented = unaccented.replaceAll("[^\p{ASCII}]", ""); // remove as sujeiras do processo acima.

    super.insertString(offs, unaccented, a);
}

}[/code]E por fim, basta fazer um setDocument:

txtSeuCampo.setDocument(new UnaccentedDocument());