Informar erro ao digitar número em JTextField

5 respostas
M

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!

5 Respostas

L

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

package util;

import java.awt.Toolkit;

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

/**
 * Classe Utilit&#65533;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 = "[telefone removido]";
    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;
    }
}

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

M

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!

V

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.

L

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?

D

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?


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…

Criado 27 de maio de 2011
Ultima resposta 27 de mai. de 2011
Respostas 5
Participantes 4