Informar erro ao digitar número em JTextField

Bom dia!

Preciso que no meu JTextField, não seja permitido a digitação de números. Até aí, sem problemas, mas gostaria que no momento que o usuário digitasse algum número, aparecesse um JOptionPane informando que apenas letras serão permitidas neste campo.

Do jeito que meu sistema encontra-se neste momento, apenas as letras são permitidas, os números não aparecem no JTextField, apenas gostaria de acrescentar esta mensagem. Segue meu código:
JTextField

tfResponsavel = new javax.swing.JTextField();
tfResponsavel.setDocument(new FormataTexto(20, 'E')); //permite no máximo 20 caracteres, somente letras maiusculas

Classe FormataTexto

import java.util.regex.Matcher;
import java.util.regex.Pattern;
import javax.swing.text.AttributeSet;
import javax.swing.text.BadLocationException;
import javax.swing.text.PlainDocument;

public class FormataTexto extends PlainDocument {

    private int iMaxLength = 0;
    private char tipo;
    Pattern texto;
    
    public FormataTexto(int maxlen, char tp) {
        super();
        iMaxLength = maxlen;
        tipo = tp;
    }
    
    public String formatar (String entrada, Integer valor){
        // 1 - somente letras e números
        // 2 - somente numeros
        // 3 - somente letras
        
        if (valor == 1){
            texto = Pattern.compile("[0-9a-z]",Pattern.CASE_INSENSITIVE);  
        } else if (valor == 2){
            texto = Pattern.compile("[0-9]",Pattern.CASE_INSENSITIVE);
        } else if (valor == 3){
            texto = Pattern.compile("[a-z]",Pattern.CASE_INSENSITIVE);
        }

        Matcher encaixe = texto.matcher(entrada);  
        StringBuffer saida = new StringBuffer();  
        while(encaixe.find())  
            saida.append(encaixe.group());  
        return saida.toString();        
    }
    
    @Override
    public void insertString(int offset, String str, AttributeSet attr) throws BadLocationException {
        if ( str == null ) return;

        boolean ok = true;

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

        // A = TUDO
        // B - SOMENTE LETRAS E NÚMEROS EM MAIÚSCULO
        // C - somente letras e números em minúsculo
        // D - SOMENTE NÚMEROS
        // E - SOMENTE LETRAS MAIÚSCULO
        // F - SOMENTE LETRAS minúsculo
        
        switch(tipo) {
            case 'B': str = formatar(str.toUpperCase(), 1); break;
            case 'C': str = formatar(str.toLowerCase(), 1); break;
            case 'D': str = formatar(str, 2); break;
            case 'E': str = formatar(str.toUpperCase(), 3); break;
            case 'F': str = formatar(str.toLowerCase(), 3); break;
        }

        int ilen = (getLength() + str.length());

        if ( ilen <= iMaxLength ) // se o comprimento final for menor...
            super.insertString( offset, str, attr ); // aceita str
        else {
            if ( getLength() == iMaxLength ) return; // nada a fazer
            String newStr = str.substring(0, (iMaxLength - getLength()));

            super.insertString( offset, newStr, attr );
        }
    }
}

Agradeço pela ajuda!

Cara até te compreendo fazer isso , mas acho desnecessário ficar aparecendo msg que não pode ser colocado letra ou nunmero no Jtext

no meu projeto eu faço dessa forma vê se consegue entender à logica:

Crie uma classe

[code]package util;

import java.awt.Toolkit;

import javax.swing.text.AttributeSet;
import javax.swing.text.BadLocationException;
import javax.swing.text.PlainDocument;

/**

  • Classe Utilit�ria que filtra os valores dentro de um textfield.
  • @author achiang

*/
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 + "_@-.+";

protected String acceptedChars = null;
protected boolean negativeAccepted = false;
protected int maxLength = 100;

public JTextFieldFilter() {
this(ALPHA_NUMERIC);
}

public JTextFieldFilter(String acceptedchars) {
this.acceptedChars = acceptedchars;
}

public JTextFieldFilter(String acceptedchars, int maxLength) {
this.acceptedChars = acceptedchars;
this.maxLength = maxLength;
}

public void setNegativeAccepted(boolean negativeaccepted) {
if (acceptedChars.equals(NUMERIC) || acceptedChars.equals(DECIMAL)
	|| acceptedChars.equals(ALPHA_NUMERIC) || acceptedChars.equals(DATE)
	|| acceptedChars.equals(CEP)) {
    negativeAccepted = negativeaccepted;
    acceptedChars += "-";
}
}

@SuppressWarnings("static-access")
public void insertString(int offset, String str, AttributeSet attr)
throws BadLocationException {
if (str == null)
    return;

// estudar sobre campos que aceitam apenas numeros..

if (acceptedChars.equals(UPPERCASE) ||acceptedChars.equals(UPPERCASE_NUMERIC) || 
	acceptedChars.equals(UPPERCASE_NUMERIC+DECIMAL) || acceptedChars.equals(UPPERCASE_NUMERIC+UPPERCASE_SPECIAL) ||
	acceptedChars.equals(UPPERCASE_NO_SPACE) || acceptedChars.equals(UPPERCASE_NUMERIC_NO_SPACE) || 
	acceptedChars.equals(ALPHA_NUMERIC_UPPERCASE))
    str = str.toUpperCase();
else if (acceptedChars.equals(LOWERCASE) || acceptedChars.equals(LOWERCASE_NUMERIC) || acceptedChars.equals(LOWERCASE_SPECIAL) ||
		acceptedChars.equals(EMAIL))
    str = str.toLowerCase();

for (int i = 0; i < str.length(); i++) {
    if (acceptedChars.indexOf(str.valueOf(str.charAt(i))) == -1)
	return;
}

if (acceptedChars.equals(DECIMAL)
	|| (acceptedChars.equals(DECIMAL + "-") && negativeAccepted)) {
    if (str.indexOf(".") != -1) {
	if (getText(0, getLength()).indexOf(".") != -1) {
	    return;
	}
    }
}

if (negativeAccepted && str.indexOf("-") != -1) {
    if (str.indexOf("-") != 0 || offset != 0) {
	return;
    }
}

//codigo para setar o maxlength
if (str == null) {
    return;
}
int strLen = str.length();
if (strLen == 0) {
    return;
}
int len = getLength();
if (strLen + len > maxLength) {
    Toolkit.getDefaultToolkit().beep();
    str = str.substring(0, maxLength - len);
}

//codigo para tirar espaço à esquerda
if (str.indexOf(" ")==0 && len==0){
	return;
}

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

/**
 * Metodo maxLength
 * @return maxLength
 */
public int maxLength() {
return maxLength;
}

}[/code]

em seguida é so implementar assimmm

campo_Nome.setDocument(new JTextFieldFilter(JTextFieldFilter.UPPERCASE,20)); campo_Nome.setHorizontalAlignment(javax.swing.JTextField.LEFT);

ele não deixa vc colocar números…qualquer coisa pergunta ai???

abrxx

Bom dia!

Eu utilizo uma classe de formatação um pouco diferente, mas que dá o mesmo resultado da sua sugestão. Também não acho legal a ideia da mensagem, mas acredite, os usuários daqui da empresa, vão perceber que o número não entra no JTextField e vão me ligar a toda hora.

Na verdade, estou pensando em fazer outro método de validação. Neste campo entra o nome do vendedor, vou fazer o correto, que é permitir apenas os vendedores previamente cadastrados. Não tenho este controle em meu sistema no momento. Da forma que está, qualquer código de vendedor errado e qualquer nome tipo DJABDS DJSDH SD S JS seria aceito.

Obrigado pela ajuda!

Eu faria meu document disparar um evento. Então capturaria esse evento na tela onde o JTextField está e definiria uma label em algum lugar com a mensagem de erro em vermelho. Claro que daria para mostrar o JOptionPane, mas acho a janelinha no meio da digitação de textos muito incômoda.

Enfim, qual seria o proposito para isso, pois o cara tem um campo CPF ele não vai querer usar letras…ai é brincadeira…

isso tem regras,campos END precisa de numeros e letras,CEP só numeros,Nome tbm podendo colocar números…

mas enfim, vc queria algo que verificasse se esta certo ou não e mostrasse a msg?

[quote=lokit"s]Enfim, qual seria o proposito para isso, pois o cara tem um campo CPF ele não vai querer usar letras…ai é brincadeira…

isso tem regras,campos END precisa de numeros e letras,CEP só numeros,Nome tbm podendo colocar números…

mas enfim, vc queria algo que verificasse se esta certo ou não e mostrasse a msg?

[/quote]
Acredite, o usuário vai querer colocar letras onde não pode e números onde não deve…

Eu faria essa verificação da forma que o vinigodoy sugeriu (acho muito chato aquelas janelinhas pulando a toda hora).
Enfim, um tooltip também é benvindo…