Inserir apenas Letras em um JTextField

18 respostas
R

Bom dia Galera, estou precisando de uma força.

Gostaria que meu JTextField aceitasse apenas letras (não numeros).

Eu possuo uma classe que herda Plain Document para definir o tamanho maximo do textfield.

Sera que alquem consegue me ajudar a implementar um metodo nessa classe que aceite somente letra.

Grato pela atenção.

18 Respostas

L

Dentro do seu PlainDocument, você poderia verificar se o caracter digitado é uma letra.

Character.isLetter( seuChar )

Acredito que desta forma você consiga digitar somente letras. Se não estou enganado, ele deve filtrar os caracteres especiais( ! @ # $ % & * ) coisas do tipo.

Até mais

R

Desculpe, sou bem iniciante. Onde devo utilizar e como chamar?

import javax.swing.text.*;

public class FixedLengthDocument extends PlainDocument
{
    private int iMaxLength;

    public FixedLengthDocument(int maxlen) {
        super();
        iMaxLength = maxlen;
    }

    @Override
    public void insertString(int offset, String str, AttributeSet attr)
                    throws BadLocationException {
        if (this == null) return;

        if (iMaxLength <= 0)        // aceitara qualquer no. de caracteres
        {
            super.insertString(offset, str, attr);
            return;
        }

        int ilen = (getLength() + str.length());
        if (ilen <= iMaxLength)    // se o comprimento final for menor...
             super.insertString(offset, str, attr);   // ...aceita str
             //super.insertString(0,"00", attr);

        }
 
}

Vlw pela atenção.

julianofischer

Utilize um JFormattedTextField!

R

Sim, como eu disse, ja consigo utilizar a classe acima para determinar o tamanho maximo do meu TextField…

Eu preciso de um parecido para que ele aceite apenas letras, e não numero e caracteres;…

julianofischer
if (ilen <= iMaxLength)    // se o comprimento final for menor...  
             boolean tudoLetra=true;
             for(int i=0;i<str.lenght;i++){
                 if(!Character.isLetter(str[i])){
                      tudoLetra=false;
                  }
             }
             if(tudoLetra){
                 super.insertString(offset, str, attr);   // ...aceita str  
                 //super.insertString(0,"00", attr);  
              }
  
 }

testa aí
fiz rapidão aqui
nao sei se funciona... nao conheço esse PlainDocument aí
mas já dá pra vc ter uma ideia

L

No seu código vc tem que inserir duas condições, mas a condição é a mesma em ambos os casos. Marquei as condições com um comentário a frente.

Veja abaixo

if (iMaxLength <= 0)        // aceitara qualquer no. de caracteres   
{   
   if ( !Character.isLetter( str.charAt( 0 ) ) ) { // Condição 1
      return;
   }

    super.insertString(offset, str, attr);   
    return;   
}   

int ilen = (getLength() + str.length());   
if (ilen <= iMaxLength) { // se o comprimento final for menor...   
   if ( !Character.isLetter( str.charAt( 0 ) ) ) { // Condição 2
       return;
   }

    super.insertString(offset, str, attr);   // ...aceita str   
    //super.insertString(0,"00", attr);   
}

Acho que isso deve resolver =)

Até mais

R

Deu alguns erros que consegui resolver, porem esta dando esse erro anexo:


julianofischer

noobei,

Troca str[i] por str.getCharAt(i)

:slight_smile:

L

Troca o str[i] por str.charAt( i )

Edit: julianofischer não tinha visto seu post

L
julianofischer:
if (ilen <= iMaxLength)    // se o comprimento final for menor...  
             boolean tudoLetra=true;
             for(int i=0;i<str.lenght;i++){
                 if(!Character.isLetter(str[i])){
                      tudoLetra=false;
                  }
             }
             if(tudoLetra){
                 super.insertString(offset, str, attr);   // ...aceita str  
                 //super.insertString(0,"00", attr);  
              }
  
 }

testa aí
fiz rapidão aqui
nao sei se funciona... nao conheço esse PlainDocument aí
mas já dá pra vc ter uma ideia

A cada caracter digitado no JTextField é executado o método insertString(...)
A variável str é somente o caracter digitado, ou seja, acho que não tem necessidade de fazer um laço nessa variável, sabendo que ela vem somente o caracter digitado.

Acredito que basta fazer testar as condições.

R

Vlw galera pela força mesmo.

Deu certo LedRenan. Batata, isso mesmo… funfou que é uma blz…

Desculpem minha ignorancia… mais tow caminhando, rsss, e ainda chego la…

Vlw julianofischer pela força tambem…

R

Agora só mais uma duvida,

Caso eu precise validar um outro jTextFiel somente aceitando numero.

Como devo proceder??? Pois já estou utilizando o metodo para validar somente letras…

Vlw galera…

L

O ideal (acredito eu) é vc ter um PlainDocument para cada tipo…um para letra e outro para números

Neste caso vc faz a verificação de digito…
Para letras faziamos…

if ( !Character.isLetter( seuChar ) ) {
         return;
}

Para números faz a seguinte condição

if ( !Character.isDigit( seuChar ) ) {
         return;
}

Até mais…

R

Galera, mais um probleminha.

Como faço para aceitar espaço???

Ele esta aceitando apenas letras, não esta aceitando espaço.

Vlw…

L

rcoimbra,
O código abaixo verifica se o caracter digitado é um espaço em branco.

Character.isWhitespace( steste.charAt( 0 ) );

Até mais!!!

R

Não consegui utilizar o codigo acima.

Onde tenho de coloca-lo no metodo???

Vlw

L

rcoimbra,
Seria mais ou menos assim…

if ( Character.isWhitespace( str.charAt( 0 ) ) || Character.isLetter( str.charAt( 0 ) ) ) {
    super.insertString( offs, str, a );
}

Você está verificando se o caracter digitado é um espaço em branco OU uma letra. Caso algum satisfaça, vc insere no componente.

R

Valew LedRenan…

show de bola, obrigado pela força mesmo…

Deu certo…

Criado 5 de julho de 2010
Ultima resposta 6 de jul. de 2010
Respostas 18
Participantes 3