Mudar formato de JFormattedTextField em tempo de execucao

Possuo um formulário de localizar, com 3 RadioButton e 1 JformattedTextField.
Os radio são: codigo, nome e cpf.
Para cada escolha dessa, o JFTextField deve possuir uma mascara.
Na primeira vez dá certo, mas nas próximas, ele não atualiza para a mascara certa.

Alguém já passou por essa experiência?

Colega,

você já pensou em criar 3 JFormattedTextField…
e de acordo com a rádio selecionada você adiciona ou remove elas da janela…

Sim, Colega, pensei…
Mas…gostaria de reaproveitar o campo…
Esta será a ultima possibilidade

Até onde é meu conhecimento, o java não tem nada pronto para seu caso (desculpe se estou errada)…
Você teria que criar uma método para verificar o documento de formatação do campo, e toda vida valida-lo…

O que posso mostrar é um código que deixa o usuario digitar formato de só números, ou datas… em fim… se ajudar:

//
// Para campos de data..
//
io_tf_teste		=	new JFormattedTextField(new SimpleDateFormat("dd/MM/yyyy"));
io_tf_teste.setBounds(10,160,200,30);
io_ct.add(io_tf_teste);

Tchau!

rapaz, faz assim:

toda vez q o cara mudar la o radio, vc remove seu JFTF e instancia otro, setando a nova mascara…

passei por essa tb, tinha criado um metodo pra, dependendo do formato q passasse, setasse uma nova mascara (criando um novo MaskFormatter e instalando ele (install) no JFTF)… mas, uma vez setado a mascara, nao consegui TROCAR…

dica: nao perde tempo com essas paradinhas de Swing… senao vai ficar louco…

Oi de novo,
Olha o fabiocsi está completamente certo!

Se você for afundo nisso ira ficar Louco!,
eu consegui um código, depois de muita busca… e ele faz isso que você quer… validando cpf e mascara de ip… mais o código está em Italiano… e é realmente ENORME…

Sugiro que mude a sua ideia…

Bju

Bem, na verdade não há nada de muuuito complicado em fazer isso.

Você está usando que tipo de formatador?

Da uma olhada como fazer usando um MaskFormatter

Primeiro, vc declara os maskformatters q vc precisa como membros da classe (do seu jframe), não esquecendo dos imports.

Imports necessários.

import java.text.*; import javax.swing.text.*;

Declaração das máscaras

private MaskFormatter mascaraRG; private MaskFormatter mascaraCPF;

No construtor do teu JFrame ou outro container, vc instancia as máscaras

try { // criando máscaras mascaraRG = new MaskFormatter( "##.###.###-#" ); mascaraCPF = new MaskFormatter( "###.###.###-##" ); } catch ( ParseException exc ) { }

E para setar a máscara q v uqre utilizar em tempo de execução é só utilizar, por exemplo

formattedTextField.setFormatterFactory( new DefaultFormatterFactory( mascaraCPF ) );

Ai vc registra os eventos dos radio buttons e quando clicar em um vc põe esse código para setar a máscara correspondente.

Falow!

1 curtida

Bem, na verdade não há nada de muuuito complicado em fazer isso.

Você está usando que tipo de formatador?

Da uma olhada como fazer usando um MaskFormatter

Primeiro, vc declara os maskformatters q vc precisa como membros da classe (do seu jframe), não esquecendo dos imports.

Imports necessários.

import java.text.*; import javax.swing.text.*;

Declaração das máscaras

private MaskFormatter mascaraRG; private MaskFormatter mascaraCPF;

No construtor do teu JFrame ou outro container, vc instancia as máscaras

try { // criando máscaras mascaraRG = new MaskFormatter( "##.###.###-#" ); mascaraCPF = new MaskFormatter( "###.###.###-##" ); } catch ( ParseException exc ) { }

E para setar a máscara q v uqre utilizar em tempo de execução é só utilizar, por exemplo

formattedTextField.setFormatterFactory( new DefaultFormatterFactory( mascaraCPF ) );

Ai vc registra os eventos dos radio buttons e quando clicar em um vc põe esse código para setar a máscara correspondente.

Falow!

Desculpem o post duplo, deu pau aqui, por favor, algum moderador, deleta um para mim :smiley:

Uma dica aos colegas.

Quando na documentação não existir uma forma explícita de como fazer algo (como por exemplo a troca de máscara) vc pode primeiro, verificar o que cada método faz e tentar chegar a solução verificando aqueles que você acha que deve fazer o serviço utilizando outras classes ou então, o que eu prefiro, dar uma olhada no código fonte do swing…

Se vcs olharem o código dos contrutores da JFormattedTextField vcs verão como é setada uma máscara. Assim é só aplicar ao que vc precisa.
No contrutor é o único local que tem explícito o uso de um Formater para utilizar no JFormattedTextField, então pesquise o código dos contrutores :smiley:

Até mais galera!

[quote=davidbuzatto]Uma dica aos colegas.

Quando na documentação não existir uma forma explícita de como fazer algo (como por exemplo a troca de máscara) vc pode primeiro, verificar o que cada método faz e tentar chegar a solução verificando aqueles que você acha que deve fazer o serviço utilizando outras classes ou então, o que eu prefiro, dar uma olhada no código fonte do swing…

Se vcs olharem o código dos contrutores da JFormattedTextField vcs verão como é setada uma máscara. Assim é só aplicar ao que vc precisa.
No contrutor é o único local que tem explícito o uso de um Formater para utilizar no JFormattedTextField, então pesquise o código dos contrutores :smiley:

Até mais galera![/quote]

Ou entao vc extende JTextField e faz o seu proprio FTF…
que e bem mais pratico do q ficar desvendando os misterios do swing :-o

Não creio que seja mais fácil implementar um formatted text field ao inés de olhar a documentação e aprender como funciona. Se algo pronto ja é misterioso como vc falou, imagina um componente reimplementado para fornecer algo que já existe…

Olhar os constructors das classes e entender como elas funcionam, como vc disse, e SEMPRE bom…

Mas as vezes vale a pena reimplantar uma coisa q ja existe… principalmente qdo essa coisa q ja existe da um tremenda DOR DE CABECA…

talvez nao seja esse o caso do JFTF…
mas funcionou pra mim qdo precisei adquirir imagens do scanner 8)

Amigos eu usei o código do nosso amigo [i]davidbuzatto [/i]

e funcionou só que quando eu digito o CNPJ e depois quero mudar para CPF o componente trava …

pq ???

Obrigado.

.

Faça isso que funciona:

[code] try {
MaskFormatter mascaraCNPJ = new MaskFormatter("###.###.###/####-##");
MaskFormatter mascaraCPF = new MaskFormatter("###.###.###-##");

        text.setValue(null); // aqui está o famoso "pulo do gato"
        if (combo.getSelectedIndex() == 0) // cpf
            text.setFormatterFactory(new DefaultFormatterFactory(mascaraCPF));
        else // cnpj
            text.setFormatterFactory(new DefaultFormatterFactory(mascaraCNPJ));
        
    } catch (ParseException e) {
        e.printStackTrace();
    }

[/code]

1 curtida

Claro, esqueci de dizer, no caso do amigo que iniciou o tópico, eu fiz o exemplo usando o combo, vc deve fazer usando seu radio.

E marciofirmino, perca essa mania de ficar mandando “.” nas msgs só pra elas aparecerem no topo da lista… os colegas vão te ajudar de qq forma, independente da sua msg ser a primeira da lista ou não, pode acreditar!

Só vão parar de te ajudar se não respeitar as regras do fórum :wink:

amigo, antes de mudar a mascara vc tem que setar o values pra “”.

campo.setValue("");

Aqui deu certo.
valeu.

Sei que é tarde para responder a esta pergunta do nosso amigo…

porém vou responder só para constar.


      if ( chk_fisica.isSelected() ){
            edt_cpfcnpj.setValue(null);
            edt_cpfcnpj.setFormatterFactory(frm_metodos.maskvalor("###.###.###-##"));
            
        }else{
             edt_cpfcnpj.setValue(null);
            edt_cpfcnpj.setFormatterFactory(frm_metodos.maskvalor("##.###.###/####-##"));
        }

Funfou que é uma blzinha!! :slight_smile:

Bom dia, estou ressucitando este tópico pois levei mais de uma hora para encontrar a solução e acredito que outros colegas devem enfrentar o mesmo problema.

Amigos, estava com o mesmo problema e encontrei uma solução em: http://javafree.uol.com.br/topic-875710-JTextField-mudando-mascara-em-tempo-de-execucao.html

O meu código ficou mais ou menos assim:


if(cbTipo.getSelectedIndex() == 1)//CNPJ


                  if(ftfPesquisa.getText().length() > 18)
    	    		{
    	    			aux = "";
    	    			ftfPesquisa.setText("");
    	    		}
    	    		
    	    		if(!cpf && !nome)
    	    		{
    	    		aux = ftfPesquisa.getText();
    	    		}

                         try
    	    		{
    	    			ftfPesquisa.setFormatterFactory(null); // desabilita a mascara aplicada 
    	    			mascaraCPF.setPlaceholderCharacter(' '); //define o caracter temporário que sesá usado na mascara 
    	    			ftfPesquisa.setFormatterFactory( new DefaultFormatterFactory(mascaraCNPJ));
    	    			ftfPesquisa.setValue(null);
    	    			
                                if(cnpj) //esse verifica se o último combobox selecionado foi um cnpj, caso positivo ele busca o cnpj digitado antes
    	    			{
    	    				ftfPesquisa.setText(aux);
    	    			}

    	    		}
    	    		catch(Exception ec)
    	    		{
    	    			ec.printStackTrace();
    	    		}  

                        cpf = false;
    	    		nome = false;
    	    		cnpj = true;   
}