Neste artigo veremos algumas soluções práticas e de simples implementação para fazer com que um campo de texto aceite apenas letras. Para isso após inserir o JTextField no formulário é necessário alterar o nome do componente, para que quando for necessário acionar as suas propriedades tenhamos uma maior facilidade.

JTextFields
Figura 1. JTextFields

Existe um componente que é o JFormattedTextField que é um campo de texto que é utilizado para definirmos a máscara do campo e assim determinarmos como as informações devem ser digitadas.

Não é o nosso objetivo trabalhar nesse post sobre o campo JFormattedTextField e sim operações que podemos aplicar sobre o JTextField para manipulá-lo de modo a exibir as informações com as quais estamos trabalhando, também de forma personalizada.

Vamos ao código para aceitar apenas letras, de forma mais geral podemos apenas criar o evento Key Typed para o componente JTextField e acrescentar o seguinte código dentro do evento Key Typed.

O evento Key Typed: pelo observado durante os testes em que foi desenvolvido esse código é gerado cada vez que um novo caracter tiver de ser adicionado a string, diferente do key pressed e do key relesead, sendo o pressed adicionado quando a tecla é pressionada e o key relesead quando a tecla é solta, ambos não gerando eventos enquanto a tecla permanece pressionada. No nosso caso causando erro durante a execução do algoritmo, por este motivo estamos trabalhando com o key Typed.


String caracteres="0987654321";
if(caracteres.contains(evt.getKeyChar()+"")){
evt.consume();
}
Listagem 1. Evento Key Tyoed do JTextField para aceitar apenas letras

Neste código, na variável String, estamos determinando quais caracteres não devem ser aceitos. Neste caso estamos apenas eliminando do componente os números.

E no if verificamos se o caracter que gerou o evento está na variável caracteres, caso esteja acionamos a propriedade consume do evento.

A propriedade consume, pode ser interpretada como:

Consome este evento de modo que não será processada na maneira padrão pela fonte que a originou.

Traduzindo, este evento não deve ser executado.

Para aprimorarmos e conseguirmos reutilizar o código, podemos criar uma classe que herde as características de um JTextField normal, e definir essas propriedades, além disso, podemos também definir o tamanho máximo que o campo deve suportar, dessa maneira também trabalhando a nivel de validação do tamanho da string que deve ser aceita em um JTextField.


public final class JtextFieldSomenteLetras extends JTextField {
private int maximoCaracteres=-1;// definição de -1 
// como  valor normal de um textfield sem limite de caracters
public JtextFieldSomenteLetras() {
        super();
        addKeyListener(new java.awt.event.KeyAdapter() {
            @Override
    public void keyTyped(java.awt.event.KeyEvent evt) {
        jTextFieldKeyTyped(evt);}});
    }

public JtextFieldSomenteLetras(int maximo) {    
    super();
    setMaximoCaracteres(maximo);// define o tamanho máximo
//que deve ser aceito no jtextfield que foi recebido no  construtor
  
        addKeyListener(new java.awt.event.KeyAdapter() {
            @Override
    public void keyTyped(java.awt.event.KeyEvent evt) {
        jTextFieldKeyTyped(evt);}});
    }
  
        private void jTextFieldKeyTyped(KeyEvent evt) {
      
String caracteres="0987654321";// lista de caracters que não devem ser aceitos
if(caracteres.contains(evt.getKeyChar()+"")){// se o character que gerou o 
evento estiver na lista
evt.consume();//aciona esse propriedade para eliminar a ação do evento
}
if((getText().length()>=getMaximoCaracteres())&&(getMaximoCaracteres()!=-1)){
//if para saber se precisa verificar também o tamanho da string do campo
// maior ou igual ao tamanho máximo, cancela e nao deixa inserir mais
evt.consume();
setText(getText().substring(0,getMaximoCaracteres()));
// esta linha acima é para remover os caracters inválidos caso o usuário tenha copiado o 
//conteúdo de algum lugar ou seja com tamanho maior que o definido
}//fim do if do tamanho sa string do campo

        }

    public int getMaximoCaracteres() {
        return maximoCaracteres;
    }
    public void setMaximoCaracteres(int maximoCaracteres) {
        this.maximoCaracteres = maximoCaracteres;
    }
}
Listagem 2. Classe herdada de JTextField

Ao criar essa classe, optamos por já definirmos no construtor a definição de duas opções: a primeira sem parâmetro, que apenas elimina os números do componente e a segunda que recebe como parâmetro o tamanho máximo da string do JTextField e verifica e deixa esses caracteres serem inseridos somente enquanto o tamanho for menor que o informado.

Para utilizar esta classe:

Após criar a classe, e colocar os imports necessários temos duas opções que vamos explicar abaixo.

No NetBeans, basta inserir um JTextField normal, clicar com o botão direito sobre o componente e ir em personalizar código.

Vai existir no lado esquerdo da janela, um combobox com duas opções código padrão e código personalizado. Vamos trocar para código personalizado.

Após a definição de new vamos mudar a classe que está sendo instanciada.

Estava assim:


jTextFieldNome = new javax.swing.JTextField();
Listagem 3. Código original do JTextField

Vamos Deixar assim:


jTextFieldNome = new JtextFieldSomenteLetras();
Listagem 4. Novo código do JTextField

Neste caso apenas acionamos a opção que vai eliminar os números do teclado.

Ou podemos deixar assim:


jTextFieldNome = new JtextFieldSomenteLetras(50);
Listagem 5. Código original do JTextField

Neste caso acionamos a opção que vai eliminar os números do teclado e também definimos o tamanho máximo do campo em 50 caracteres.

Também podemos instanciar normal caso não esteja utilizando o NetBeans. Basta ir no local que está instanciando a trocar o nome da classe para o JtextFieldSomenteLetras.

Dessa maneira, basta repetir esse processo para todos os campos que pretende eliminar a digitação de números e definir também o tamanho máximo do campo. Facilitando assim o processo de validação dos campos do formulário.

Seguindo o mesmo raciocínio, é possível alterar o padrão de código para criar uma classe que aceite apenas números ou um conjunto de caracteres definidos por nós, já que neste caso trabalhamos eliminando os caracteres da lista.