Como fazer para o campo TextField receber só numeros?

Ola galera sou eu mais uma vez…

Fiz algumas pesquisas no google mais não obtive sucesso peço que se possivel me ajudem.

Bom preciso fazer com que o campo TextField receba somente numeros ao inves de numeros + string.

Quero so numeros como proceder.

Agradeço qualquer ajuda.

Você tem 2 alternativas:

  1. Usar o JFormattedTextField, e fornecer a ele uma máscara numérica;
  2. Implementar um Document que só aceite números. Nesse caso, leia esse artigo do GUJ para entender como o Document funciona e adapte-o a sua necessidade: http://www.guj.com.br/java.tutorial.artigo.29.1.guj
1 curtida

Por sorte, eu já tenho as classes aqui:

[code]
/* FixedLengthDocument.java */

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

public class IntegerDocument extends FixedLengthDocument {
public IntegerDocument(int maxlen) {
super(maxlen);
}

@Override
public void insertString(int offset, String str, AttributeSet attr)
        throws BadLocationException {
    if (str == null)
        return;
    
    try {
        Integer.parseInt(str);
    } catch (Exception e) {
        return;
    }
    
    super.insertString(offset, str, attr);
}

}[/code]

E uma que limita o tamanho máximo no JTextField.

[code]
import javax.swing.text.AttributeSet;
import javax.swing.text.BadLocationException;
import javax.swing.text.PlainDocument;

public class FixedLengthDocument extends PlainDocument {
private int maxLength;

public FixedLengthDocument(int maxlen) {
    super();
    
    if (maxlen <= 0)
        throw new IllegalArgumentException("You must specify a maximum length!");
    
    maxLength = maxlen;
}

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

    int totalLen = (getLength() + str.length());
    if (totalLen <= maxLength) {
        super.insertString(offset, str, attr);
        return;
    }
    
    String newStr = str.substring(0, (maxLength - getLength()));
    super.insertString(offset, newStr, attr);
}

}[/code]

1 curtida

Valeu cara ViniGodoy é exatamente o que precisava.
muito obrigado cara.

Fica com DEUS e ate a proxima.FUi.

ohh, value aew
super bacana isso
flwww

Como faço pra setar um valor que utiliza um plain document?

Tenho um controle de dinheiro, preciso fazer valor.set(valoraserpago); mas não consigo dessa forma, como realizo esta atividade?

Fla galera! Bom, o tópico é meio antigo, mas vou deixar uma ajuda caso alguem pergunte ao prof. google rs…

Seguinte, ao especializar a classe PlainDocument, temos um problema quando usamos o BeansBinding, pois ele usa o Document do próprio binding. Implementei as duas classes abaixo, que podem ser alteradas de acordo com a necessidade, especializando a classe DocumentFilter (descobri isso através de pesquisas, as quais tem as referências no fim da msg). Ao setar este document em um JTextField é necessário fazer um cast. Segue o código:

/*
 * Esta classe limita o número de caracteres inseridos em um JTextField
 * Para usar este Document: ((AbstractDocument)jTextField.getDocuement()).setDocumentFilter(new FixedLengthDocument(5));
 */
package util;

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

/**
 *
 * @author Paulo Alonso
 */
public class FixedLenghtDocument extends DocumentFilter {
    private int iMaxLength;  
   
    public FixedLenghtDocument(int maxlen) {  
        super();  
        iMaxLength = maxlen;  
    }
    
    @Override
    public void insertString(FilterBypass fb, int offset, String str, AttributeSet attr) throws BadLocationException {
        if (str == null) return;  

        // aceitara qualquer número de caracteres
        if (iMaxLength <= 0) {                   
            fb.insertString(offset, str, attr);  
            return;  
        }
        
        int ilen = (fb.getDocument().getLength() + str.length());
        
        // se o comprimento final for menor, aceita str
        if (ilen <= iMaxLength) {
            fb.insertString(offset, str, attr); 
        } else {
            // se o comprimento for igual ao máximo, não faz nada
            if (fb.getDocument().getLength() == iMaxLength) return;
            
            // se ainda resta espaço na String, pega os caracteres aceitos
            String newStr = str.substring(0, (iMaxLength - fb.getDocument().getLength()));  

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

    @Override
    public void replace(FilterBypass fb, int offset, int length, String str, AttributeSet attr) throws BadLocationException {
        if (str == null) return;  

        // aceitara qualquer número de caracteres
        if (iMaxLength <= 0) {                   
            fb.insertString(offset, str, attr);  
            return;  
        }
        
        int ilen = (fb.getDocument().getLength() + str.length());
        
        // se o comprimento final for menor, aceita str
        if (ilen <= iMaxLength) {
            fb.insertString(offset, str, attr); 
        } else {
            // se o comprimento for igual ao máximo, não faz nada
            if (fb.getDocument().getLength() == iMaxLength) return;
            
            // se ainda resta espaço na String, pega os caracteres aceitos
            String newStr = str.substring(0, (iMaxLength - fb.getDocument().getLength()));  

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

Obs.: Não entendi bem a diferença entre insertString() e replace(), deixei os dois iguais e funcionou, se alguém souber, posta aí

Esta classe especializa FixedLenghtDocument e permite somente números e pontos, além de limitar o número de caracteres

/*
 * Esta classe permite que apenas números sejam inseridos em um JTextField
 * Para usar este Document: ((AbstractDocuement) jTextField.getDocument()).setDocumentFilter(new IntegerDocument());
 */
package util;

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

/**
 *
 * @author Paulo Alonso
 */
public class IeValidator extends FixedLenghtDocument {
    
    public IeValidator(int maxLenght) {
        super(maxLenght);
    }
    
    @Override
    public void insertString(FilterBypass fb, int offset, String str, AttributeSet attr) throws BadLocationException {
        char c;
        byte n = 1;
        
        // percorre a string
        for (byte i=0;i<str.length();i++){
            
            // armazena o caracter
            c = str.charAt(i);
            
            // se não for número ou ponto
            if(!Character.isDigit(c) & c != '.')
                    n = 0;
        }
        
        // se n não for igual a zero, todos os caracteres são numéricos
        if(n != 0)
            super.insertString(fb, offset, str, attr);
    }

    @Override
    public void replace(FilterBypass fb, int offset, int length, String str, AttributeSet attr) throws BadLocationException {
        char c;
        byte n = 1;
        
        // percorre a string
        for (byte i=0;i<str.length();i++){
            
            // armazena o caracter
            c = str.charAt(i);
            
            // se não for número ou ponto
            if(!Character.isDigit(c) & c != '.')
                    n = 0;
        }
        
        // se n não for igual a zero, todos os caracteres são numéricos
        if(n != 0)
            super.insertString(fb, offset, str, attr);
    }
}

Aplicação

((AbstractDocument) txtIe.getDocument()).setDocumentFilter(new util.IeValidator(5));

Referências

http://www.guj.com.br/java/127759-maxlenght–jtextfield–swing–beansbinding
http://www.java2s.com/Code/JavaAPI/javax.swing.text/AbstractDocumentsetDocumentFilterDocumentFilterfilter.htm

Abraço!

1 curtida

[quote=ViniGodoy]Você tem 2 alternativas:

  1. Usar o JFormattedTextField, e fornecer a ele uma máscara numérica;
  2. Implementar um Document que só aceite números. Nesse caso, leia esse artigo do GUJ para entender como o Document funciona e adapte-o a sua necessidade: http://www.guj.com.br/java.tutorial.artigo.29.1.guj[/quote]

[quote=ViniGodoy]Por sorte, eu já tenho as classes aqui:

[code]
/* FixedLengthDocument.java */

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

public class IntegerDocument extends FixedLengthDocument {
public IntegerDocument(int maxlen) {
super(maxlen);
}

@Override
public void insertString(int offset, String str, AttributeSet attr)
        throws BadLocationException {
    if (str == null)
        return;
    
    try {
        Integer.parseInt(str);
    } catch (Exception e) {
        return;
    }
    
    super.insertString(offset, str, attr);
}

}[/code]

E uma que limita o tamanho máximo no JTextField.

[code]
import javax.swing.text.AttributeSet;
import javax.swing.text.BadLocationException;
import javax.swing.text.PlainDocument;

public class FixedLengthDocument extends PlainDocument {
private int maxLength;

public FixedLengthDocument(int maxlen) {
    super();
    
    if (maxlen &lt;= 0)
        throw new IllegalArgumentException(&quot;You must specify a maximum length!&quot;);
    
    maxLength = maxlen;
}

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

    int totalLen = (getLength() + str.length());
    if (totalLen &lt;= maxLength) {
        super.insertString(offset, str, attr);
        return;
    }
    
    String newStr = str.substring(0, (maxLength - getLength()));
    super.insertString(offset, newStr, attr);
}

}[/code][/quote]

Só dando um res aqui pra agradecer a esses dois posts, resolveram um problema com meu projeto.
Obrigado :slight_smile:

[quote=Bruno M Gasparotto]Só dando um res aqui pra agradecer a esses dois posts, resolveram um problema com meu projeto.
Obrigado :)[/quote]

De nada. Eu mantenho ele nos meus favoritos pois vivem me perguntando disso. :wink:

pergunta, como usar isso no netbeans 6.9.1 , tive que perguntar pq sinceramente nao consegui fazer.

Mais uma implementação que fiz com base nas dicas do ViniGodoy, uma única classe que pode fazer várias validações em um JTextField

/*
 * Esta classe limita o número de caracteres inseridos em um JTextField
 * Para usar este Document: ((AbstractDocument)jTextField.getDocuement()).setDocumentFilter(new FixedLengthDocument(5));
 */
package util.fieldValidation;

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

public class FixedLenghtDocument extends DocumentFilter {
    private int iMaxLength;
   
    public FixedLenghtDocument(int maxLen) {
        super();
        iMaxLength = maxLen;
    }
    
    @Override
    public void insertString(FilterBypass fb, int offset, String str, AttributeSet attr) throws BadLocationException {
        // Método não utilizado, mas sua implementação é obrigatória
    }

    @Override
    public void replace(FilterBypass fb, int offset, int length, String str, AttributeSet attr) throws BadLocationException {
        if (str == null) return;
        
        // Aceita qualquer número de caracteres
        if (iMaxLength <= 0) {                   
            if(length == 0)
                // Se não houver seleção no campo, insere a string
                fb.insertString(offset, str, attr);
            else
                // Caso tenha seleção, substitui o trecho selecionado pela string
                fb.replace(offset, length, str, attr);
            
            return;  
        }
        
        int ilen = (fb.getDocument().getLength() + str.length());
        
        // Se o comprimento final for menor, aceita str
        if (ilen <= iMaxLength) {
            if(length == 0)
                // Se não houver seleção no campo, insere a string
                fb.insertString(offset, str, attr);
            else
                // Caso tenha seleção, substitui o trecho selecionado pela string
                fb.replace(offset, length, str, attr);
        } else {
            // Se o comprimento for igual ao máximo, não faz nada
            if (fb.getDocument().getLength() == iMaxLength)
                return;
            
            // Se ainda resta espaço na String, pega os caracteres aceitos
            String newStr = str.substring(0, (iMaxLength - fb.getDocument().getLength()));  
            
            if(length == 0)
                // Se não houver seleção no campo, insere a string
                fb.insertString(offset, newStr, attr);
            else
                // Caso tenha seleção, substitui o trecho selecionado pela string
                fb.replace(offset, length, newStr, attr);
        }
    }
}
/*
 * Esta classe realiza vários tipos de validação em um JTextField
 * Para usar este Document: ((AbstractDocuement) jTextField.getDocument()).setDocumentFilter(new FloatValidator());
 */
package util.fieldValidation;

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

/**
 *
 * @author Paulo Alonso
 */
public class RandomValidator extends FixedLenghtDocument {
    /**
     * Determina quais caracteres especiais serão permitidos
     */
    private char[] specialCharactersAllowed;
    
    /**
     * Determina se qualquer caracter especial poderá ser digitado
     */
    private boolean allSpecialCharacterAllowed;
    
    /** 
     * Determina se números serão permitidos
     */
    private boolean intAllowed;
    
    /**
     * Determina se letras serão permitidos
     */
    private boolean lettersAllowed;
    
    /**
     * Determina se fará validação de ponto flutuante
     */
    private boolean floatValidation;
    
    /**
     * Verifica se já existe ponto na string
     */
    private boolean point;
    
    public RandomValidator(int maxLenght, boolean intAllowed, boolean floatValidation, boolean lettersAllowed, boolean allSpecialCharacterAllowed, char ... specialCharactersAllowed) {
        super(maxLenght);
        this.intAllowed = intAllowed;
        this.floatValidation = floatValidation;
        this.lettersAllowed = lettersAllowed;
        this.allSpecialCharacterAllowed = allSpecialCharacterAllowed;
        this.specialCharactersAllowed = specialCharactersAllowed;        
    }
    
    @Override
    public void insertString(FilterBypass fb, int offset, String str, AttributeSet attr) throws BadLocationException {
        // Método não utilizado, mas sua implementação é obrigatória
    }

    @Override
    public void replace(FilterBypass fb, int offset, int length, String str, AttributeSet attr) throws BadLocationException {
        char c;
        byte n = 1;
        
        // Se for validar ponto flutuante
        if (floatValidation) {
            // Caso tenha seleção, verifica se há ponto na seleção, se houver, ele será apagado e um novo ponto pode ser digitado
            if(length > 0)
                for(int i=0;i<length;i++) {
                    c = fb.getDocument().getText(offset, length).charAt(i);

                    if(c == '.') {
                        point = false;
                        break;
                    }
                }
            // Se não houver seleção, verifica se há ponto na string inteira
            else
                for(int i=0;i<fb.getDocument().getLength();i++) {
                    c = fb.getDocument().getText(0, fb.getDocument().getLength()).charAt(i);

                    if(c == '.') {
                        point = true;
                        break;
                    } else {
                        point = false;
                    }
                }
        }
        
        // Percorre a string
        for (byte i=0;i<str.length();i++){
            boolean isDigit = false;
            boolean isLetter = false;
            
            // Armazena o caracter
            c = str.charAt(i);
            
            // Se o caracter for numérico e não for permitido números
            if(Character.isDigit(c) && !intAllowed) {
                n = 0;
                isDigit = true;  
            } else if(Character.isDigit(c))
                isDigit = true;
            
            // Se o caracter for letra e não for permitido letras
            if((Character.getNumericValue(c) >= 10 && Character.getNumericValue(c) <= 35) && (!lettersAllowed || floatValidation)) {
                n = 0;
                isLetter = true;
            } else if(Character.getNumericValue(c) >= 10 && Character.getNumericValue(c) <= 35)
                isLetter = true;
            
            // Verificação de caracteres especiais
            if (!allSpecialCharacterAllowed && specialCharactersAllowed.length > 0 && !isLetter && !isDigit)
                for(int k=0;k<specialCharactersAllowed.length;k++)
                    if(c != specialCharactersAllowed[k])
                        n = 0;
                    else {
                        n = 1;
                        break;
                    }
            else if (allSpecialCharacterAllowed && !isLetter && !isDigit)
                n = 1;
            else if (!isLetter && !isDigit)
                n = 0;
            
            // Se estiver validando ponto flutuante
            if (floatValidation) {            
                // Se for um ponto e já ouver um ponto na string
                if ((c == '.') & point)
                    n = 0;
                // Se for um ponto e não houver ponto na string
                else if (c == '.') {
                    n = 1;
                    point = true;
                }
            }
        }
        
        // Se n não for igual a zero, todos os caracteres são permitidos
        if(n != 0)
            super.replace(fb, offset, length, str, attr);
    }

    public boolean isFloatValidation() {
        return floatValidation;
    }

    public void setFloatValidation(boolean floatValidation) {
        this.floatValidation = floatValidation;
    }

    public boolean isIntAllowed() {
        return intAllowed;
    }

    public void setIntAllowed(boolean intAllowed) {
        this.intAllowed = intAllowed;
    }

    public boolean isLettersAllowed() {
        return lettersAllowed;
    }

    public void setLettersAllowed(boolean lettersAllowed) {
        this.lettersAllowed = lettersAllowed;
    }

    public char[] getSpecialCharactersAllowed() {
        return specialCharactersAllowed;
    }

    public void setSpecialCharactersAllowed(char[] specialCharactersAllowed) {
        this.specialCharactersAllowed = specialCharactersAllowed;
    }

    public boolean isAllSpecialChacacterAllowed() {
        return allSpecialCharacterAllowed;
    }

    public void setAllSpecialChacacterAllowed(boolean allSpecialChacacterAllowed) {
        this.allSpecialCharacterAllowed = allSpecialChacacterAllowed;
    }

    public boolean hasPoint() {
        return point;
    }

    public void setPoint(boolean point) {
        this.point = point;
    }
}

Exemplo de utilização:

((AbstractDocument) txtTexto.getDocument()).setDocumentFilter(new RandomValidator(0, true, false, false, false, '.', '-'));

Este exemplo vai permitir somente números, pontos e hífens.

[quote=Soulslinux]Tenho um jtextefield mas e ele e viculado a uma mastertable e essa classe nao funciona, mas quando não esta vinculado funciniona.

Sera alguem pode me ajudar com isso???
/quote]

Se vc estiver tentando editar dados e no valor do banco de dados tem algum caracter que não é aceito pela classe, não vai aparecer nada no campo.

o Jtextfield mesmo chamando a classe ele aceita digitatar qualquer caracter.

Muito estranho… eu testei bastante esta classe e ela funcionou perfeitamente. Você está usando desta maneira:

((AbstractDocument) txtTexto.getDocument()).setDocumentFilter(new RandomValidator(0, true, false, false, false, '.', '-'));

Note que você tem que passar os parâmetros de acordo com sua necessidade.

Veja o construtor:

public RandomValidator(int maxLenght, boolean intAllowed, boolean floatValidation, boolean lettersAllowed, boolean allSpecialCharacterAllowed, char ... specialCharactersAllowed)

Na ordem:

Número máximo de caracteres
Permite números
Valida ponto flutuante (1.50, por exemplo)
Permite letras
Permite todos os caracteres especias
Caracteres especiais permitidos (pode passar quantos quiser como parâmetro, note que no exemplo permite ‘.’ e ‘-’

Eu fiz algumas alterações nesta classe, onde é possível informar quantas casas decimais um float pode ter, por exemplo, entre outras melhorias como construtores específicos para cada situação, mas não tenho ela aqui no momento. Outra coisa importante é que esta classe deve herdar FixedLenghDocument, que está no post anterior.

Consegui descobri o que tava errado aki muito obrigado!!!

[E realmete nao sei pq nao funciona, to usando ela certinha e nao da certo…e como eu disse numjtextfield sem viculação funciona perfeitamente… mas eu uso formulario de amostra mestre detalhe.

Postando somente em agradecimento.
O post do viniGodoy solucionou meu problema.
Obrigado.

[quote=lucastafarelbs]Postando somente em agradecimento.
O post do viniGodoy solucionou meu problema.
Obrigado.[/quote]

Seis anos depois mas… de nada!