MaskFormatter - SOCORRO!

Pessoal,

Postei este tópico no avançados pelo seguinte: Já abri vários tópicos sobre este problema, em diversos foruns e até então ninguém conseguiu descobrir uma solução, veja:

Estou trocando meus JTextFields por JFormattedTextField, para implementar validações nos campos de texto ; Aí que começa o problema:

tenho um campo que entra informações de nome do usuario (Antigo JTextfield, agora JFormattedTextField), Queria colocar restrições para que aceite somente caracteres válidos, o que fiz:

Coloque o maskformatter(“UUUUUUUU”) //para resumir 20"U"s, conforme tamanho do meu campo na tabela.

Acontece que funciona perfeitamente se os 20 digitos forem preenchidos, do contrário os caracteres são perdidos; O seja, se o usuario digitar um nome que contenha 20 letras, funciona normal, mas se o nome tiver menos de 20, por exemplo 2,5,10,…letras (<20 letras) some os caracteres quando muda de campo…!!!

Alguém sabe o que deve ser feito?
Agradeço a todos,

Você sabe que neste tipo de objeto, existem duas propriedades diferentes:

Não será isto que está te atrapalhando ?

Dê uma olhada em http://java.sun.com/docs/books/tutorial/uiswing/components/formattedtextfield.html#value

Se não resolver, escreva novamente

Abraço,

Márcio

seuJFormattedTextFiled.setFocusLostBehavior(JFormattedTextField.COMMIT).

Tome cuidado com posts
:arrow: Genêro SOCORRO, HELP e derivados, pois dá desconforto para ler e ignoram o tópico.
:arrow: Post com letra maiuscula tem a impressão que está GRITANDO.

Até.

coloquei o metodo setFocusLostBehavior() e a principio os caracteres pararam de sumir ao mudar de campo, mas ainda tem um problema: Nao consigo fazer com que , ao consultar a tabela a informação seja exibida neste campo…!

Quando utilizo o System.out.println, ele exibe a informação, porem quando utilizo o “setText” ou “setValue” para exibir esta informação contida na string que recebeu a informação da tabela, no campo ele nao aparece.

A proposito, o que faz este método setFocusLostBehavior(JFormattedTextField.COMMIT) ? Devo instanciá-lo somente na criação do objeto, ou sempre quando houver uma inserção na tabela?

Valeu pessoal…

PS: O amigo tem razão, nao deveria ter colocado “SOCORRO” e ainda mais em maiúsculo…desculpe-me!

Opa,

Cara, tenho quase certeza que tu está usando a ferramenta errada.

Ao inves de usar MaskFormatter (que serve quando tu tens um campo com valor FIXO de caracteres), use DocumentFilter

Tu precisa criar uma classe que estenda um DocumentFilter. Ai tu faz assim:

((AbstractDocument)textField.getDocument()).setDocumentFilter(new MyFilter());

Ai tu implementa as funções de inserção, remoção e replace do filtro.

Eu sei que eh mais complicado, mas eh o jeito. (passei alguns dias investigando isso).

Pra não te deixar totalmente na mão, vou mandar um exemplo de filter (eh provavel que eu nao olhe mais esse topico, cai aqui sem querer e resolvi ajudar :stuck_out_tongue: )

package com.zipstudio.siaps.filters;

import java.awt.Toolkit;
import java.util.regex.Pattern;

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

public class NameDocumentFilter extends DocumentFilter {

    public NameDocumentFilter() {
    }

    public void insertString(FilterBypass fb, int offs,
                             String str, AttributeSet a)
        throws BadLocationException {
    	if (str == null || str.equals("") || str.equals(" ")){
    		fb.insertString(offs, str, a);
    	} else if (Pattern.compile("([a-zA-Z]+ ?)*").matcher(str).matches() ){
    		fb.insertString(offs, str.toUpperCase(), a);
    	} else {
    		Toolkit.getDefaultToolkit().beep();
    		System.out.println("Filter not entered: "+str);
    	}
    }
    
    public void replace(FilterBypass fb, int offs,
                        int length, 
                        String str, AttributeSet a)
        throws BadLocationException {
    	if (str == null || str.equals("") || str.equals(" ")){
    		fb.replace(offs, length, str, a);
    	} else if (Pattern.compile("([a-zA-Z]+ ?)*").matcher(str).matches()){
    		fb.replace(offs, length, str.toUpperCase(), a);
    	} else {
    		Toolkit.getDefaultToolkit().beep();
    		System.out.println("Filter not replaced: "+str);
    	}
    }
}

Seja feliz! :smiley:

[]`s
Giovani

Além das questões que já foram apontadas, existe o seguinte:

A máscara U só aceita letras, não aceita espaço.

Outra coisa que também podem te ajudar futuramente são os métodos setPlaceholder e setPlaceholderCharacter do MaskFormatter.

Dê uma olhada.

ai ao inves de usar esse monte de coisas pq nao usa um if()

if(textField.getText().length() >= 21){
    JoptionPane.showMessageDialog(null, "Nome deve contem no maximo 20 caracteres", "Atencao", joptionPane.warring_message);
}else

Estava fazendo uns testes aqui com a classe MaskFormater e percebi o seguinte:
o método setValidCharacters() possui uma validação de caracter a caracter, mas não valida o espaço, ou seja, impossível utilização com espaço neste método;
já com o método setInvalidCharacters() é possível colocar todos os caracteres indesejados e ainda funciona o espaço no JFormattedTextField. No método setMask() é necessário colocar * no lugar de #, significando que pode ter como entrada qualquer coisa. Exemplo:

[code]private static final String ALFACARACTERS = “abcdefghijklmnopqrstuvxwyzzABCDEFGHIJKLMNOPQRSTUVXWYZ”;
private static final String PONTUACAO = “’!@#$%¨&*()_+¹²³£¢¬§=`´{[ª^~}]º<,>.:;?/|\”-çÇ";

private MaskFormatter mascaraTelefone() {

	MaskFormatter mask = new MaskFormatter();
	mask.setInvalidCharacters(ALPHACARACTERS+PONTUAL);
	try {
		mask.setMask("(**) *****-****");
		mask.setPlaceholderCharacter(' ');
	} catch (Exception e) {
		// TODO: handle exception
		e.printStackTrace();
	}
	
	return mask;

}[/code]

1 curtida