MaskFormatter somente números

pesquisei no forum nao achei algo parecido. entao vamos la… se puderem me ajudar…

no caso de datas… é só usar assim: (new javax.swing.text.MaskFormatter("##/##/####")
que automaticamente o campo só vai deixar digitar numeros

porém usando o maskformatter: #,##0.00 … ele vai deixar digitar letras… qdo sai do campo valida as vezes não valida…

então… queria ver se tem um maskformatter… como no caso da data… que permitisse somente números…

("##/##/####") permite somente numeros…
("#,##0.00") permite numeros e letras… nao sei porque!

Obrigado a todos

Oi,

Assim não funciona? b;[/b]

Tchauzin!

Mas o caracter ‘A’ no MaskFormatter é justamente uma letra e é isso que ele quer evitar.

Realmente,
foi a resposta mais tosca que coloquei até hj!

Onde estou com a cabeça! ha

hehe… mas de qualquer forma Obrigado por contribuir :slight_smile:

Realmente,
foi a resposta mais tosca que coloquei até hj!

Onde estou com a cabeça! ha[/quote]

Você é linda, a gente perdoa :lol: :wink:

Realmente,
foi a resposta mais tosca que coloquei até hj!

Onde estou com a cabeça! ha[/quote]

Acontece…

Quanto à dúvida, o zero não entra como nenhum tipo de caracter no construtor de MaskFormatter. Ou seja, o zero NÃO significa que haverá obrigatóriamente ao menos uma casa inteira e duas decimais. Se você usar somente: ("#,###.##") não resolve?

Realmente,
foi a resposta mais tosca que coloquei até hj!

Onde estou com a cabeça! ha[/quote]

Acontece…

Quanto à dúvida, o zero não entra como nenhum tipo de caracter no construtor de MaskFormatter. Ou seja, o zero NÃO significa que haverá obrigatóriamente ao menos uma casa inteira e duas decimais. Se você usar somente: ("#,###.##") não resolve?[/quote]

nao dá certo… ele permite digitar letras normalmente… porém valida ao sair do campo… mas essa validação q o campo faz é “falhado” … funciona e as vezes nao funciona

Ou, em último caso, apele pra agressividade! Se a tecla que o usuário pressionou não for um dígito, não deixe que ela apareça. Para isso, terá que adicionar um KeyListener no seu componente de texto e escrever o método keyPressed. Algo como:

public void keyPressed(KeyEvent e) {
    char tecla = e.getKeyChar();
    if (tecla == ',') {
        if (seuComponentDeTexto.getText().contains(",") {
            e.consume();
        } else {
            return;
        }
    }
    if (!Character.isDigit(tecla)) {
        e.consume();
    }
}

[quote=marcobiscaro2112]Ou, em último caso, apele pra agressividade! Se a tecla que o usuário pressionou não for um dígito, não deixe que ela apareça. Para isso, terá que adicionar um KeyListener no seu componente de texto e escrever o método keyPressed. Algo como:

public void keyPressed(KeyEvent e) { char tecla = e.getKeyChar(); if (tecla == ',') { if (seuComponentDeTexto.getText().contains(",") { e.consume(); } else { return; } } if (!Character.isDigit(tecla)) { e.consume(); } } [/quote]

bom acabei fazendo isso mesmo… fiz um método na classe pai… que varre os componentes… e de acordo com critérios ele seta o keyTyped…

Obrigado a todos

Tb sempre procurei um componente para fazer o controle de entradas monetárias em Real. Como nunca encontrei, acabei fazendo uma que funcionasse de forma parecida com a entrada de valores de caixas eletrônicos. Dá uma olhada e ve se te serve:

[code]public class TextFieldMoedaReal extends JTextField implements KeyListener {
private StringBuilder lastValidNumber;
private int maxDigits=10;

/**
 * Aceita um BigDecimal com escala 2. 
 * Outras escalas não são serão aceitas
 * 
 * @param BigDecimal
 */
 
public void setNumber(BigDecimal decimal){
	if(decimal.scale()==2&&decimal.unscaledValue().toString().length()<maxDigits){
		lastValidNumber=new StringBuilder(decimal.unscaledValue().toString());
		super.setText(getRealFormat());
	}
}
/**Retorna um BigDecimal com o valor encontrando no campo
 * e com escala igual a 2
 * 
 * @return BigDecimal
 */
public BigDecimal getNumber(){
	BigDecimal number;
	if(lastValidNumber.length()==0)
		number=new BigDecimal("0");
	else
		number=new BigDecimal(lastValidNumber.toString());
	number.setScale(2);
	return number.divide(new BigDecimal(100));
}

/**Aceita valor em centavos. 
 * O valor não deve possuir ponto ou vírgula
 * 
 * @param String
 */
public void setText(String number){
	if(isNumber(number)&&number.length()<maxDigits)
		lastValidNumber=new StringBuilder(number);
	else if("".equals(number))
		lastValidNumber=new StringBuilder();
	super.setText(getRealFormat());
	
}

private boolean isNumber(String number){
	for(char c: number.toCharArray()){
		if(!Character.isDigit(c))
			return false;
	}
	return true;
}
public TextFieldMoedaReal() {
	super();
	this.setCaretPosition(this.getText().length());
	this.addKeyListener(this);
	lastValidNumber=new StringBuilder();
	super.setText(getRealFormat());
}

@Override
public void keyPressed(KeyEvent e) {
	
}

@Override
public void keyReleased(KeyEvent e) {
	if(Character.isDigit(e.getKeyChar())&&lastValidNumber.length()<maxDigits){
		lastValidNumber.append(e.getKeyChar());
	}
	else if(e.getKeyCode()==KeyEvent.VK_BACK_SPACE||e.getKeyCode()==KeyEvent.VK_DELETE){
		if(lastValidNumber.length()>0){
			lastValidNumber.deleteCharAt(lastValidNumber.length()-1);
		}
	}

	super.setText(getRealFormat());
	
}

@Override
public void keyTyped(KeyEvent e) {
	
}

private String getRealFormat(){
	if(lastValidNumber.length()==0)
		return "0,00";
	else if(lastValidNumber.length()==1)
		return "0,0"+lastValidNumber;
	else if(lastValidNumber.length()==2)
		return "0,"+lastValidNumber;
	else
		return buildPrefixSeparatedWithDots()+lastValidNumber.substring(lastValidNumber.length()-2);
}

private String buildPrefixSeparatedWithDots(){
	StringBuilder builder=new StringBuilder();
	for(int index=0;index<lastValidNumber.length()-2;++index){
		builder.append(lastValidNumber.charAt(index));
		if((lastValidNumber.length()-index)%3==0&&lastValidNumber.length()-index>5)
			builder.append(".");
	}
	builder.append(',');
	return builder.toString();
}
public int getMaxDigits() {
	return maxDigits;
}
public void setMaxDigits(int maxDigits) {
	this.maxDigits = maxDigits;
}

}[/code]

uoww renzonuccitelli

fera esse seu código… valeu…

no caso do netbeans… sera que é possivel adicionar a paleta e trabalhar de forma visual com ele ?

achei…

http://weblogs.java.net/blog/claudio/archive/nb-reusable.html

somente adicionar os componentes e pau :slight_smile:

Velho… valew mesmo…

Agora me diz uma coisa… Não achaste nada mesmo pela API do JFormattedTextField ???

Falows :wink:

Eu dei uma boa lida na API e em outras coisas ligadas ao assunto. Vi que teria como fazer a validação usando um AbstractDocument, num tutorial aki do GUJ msm, mas achei muito enrolado o processo. A coisa boa dele é que não teria o efeito de os caracteres aparecerem primeiro e depois serem corrigidos, como acontece na classe que postei, mas isso não foi um problema para minha aplicação.

usando o próprio MaskFormatter, sem força bruta.

javax.swing.text.MaskFormatter maskCPF = null; try { maskCPF = new javax.swing.text.MaskFormatter("###.###.###-##"); maskCPF.setPlaceholder("_"); maskCPF.setValidCharacters("0123456789"); } catch (java.text.ParseException e) {}

como meu código mostra, é só setar: minhaMascara.setValidCharacters(“0123456789”);

depois de um tempo, mas espero que ajude quem passar por aqui. Se alguém usar, deixa uma mensagem pra gente saber! :wink:

Realmente,
foi a resposta mais tosca que coloquei até hj!

Onde estou com a cabeça! ha[/quote]

kkkkkkkkkkkkkk