Estou usando um componente JFormattedTextField para representar um campo de telefone mas está dando erro. Podem me dar um exemplo de como fazer? Já testei “(##)####-####”, “(**)-” e “([telefone removido]” mas não funcionam. O caracter # parecer representar uma sequência de caracteres e não um caracter apenas. Quando testo a máscara, todo o número de digitei é substituído apenas pelo primeiro # ou 0.
Outra dúvida, tem como os caracteres fixos aparecerem no edit? Gostaria que os parentes e ífens ficassem fixos no edit.
javax.swing.text.MaskFormatter maskTelFormatado = null;
try{
maskTelFormatado = new javax.swing.text.MaskFormatter("(##)####-####");
}
catch (java.text.ParseException exc){}
txtTelefoneFormatado = new javax.swing.JFormattedTextField(maskTelFormatado);
Abraços!
geidivan
Como disse, não funcionou.
Ele entende o # como um conjunto de caracteres e os parenteses e ifen não aparecem.
ajfilho
Posta tua classe então para ver como tu aplicaste essa máscara.
ajfilho
Olha o exemplo que fiz. Funciona que é uma maravilha 8)
/* * TesteMascaraTelefone.java * * Created on December 3, 2008, 1:29 PM *//** * * @author AJFILHO */publicclassTesteMascaraTelefoneextendsjavax.swing.JFrame{/** Creates new form TesteMascaraTelefone */publicTesteMascaraTelefone(){initComponents();}/** This method is called from within the constructor to * initialize the form. * WARNING: Do NOT modify this code. The content of this method is * always regenerated by the Form Editor. */@SuppressWarnings("unchecked")// <editor-fold defaultstate="collapsed" desc="Generated Code">//GEN-BEGIN:initComponentsprivatevoidinitComponents(){javax.swing.text.MaskFormattermaskTelFormatado=null;try{maskTelFormatado=newjavax.swing.text.MaskFormatter("(##)####-####");}catch(java.text.ParseExceptionexc){}txtTelefoneFormatado=txtTelefoneFormatado=newjavax.swing.JFormattedTextField(maskTelFormatado);setDefaultCloseOperation(javax.swing.WindowConstants.EXIT_ON_CLOSE);javax.swing.GroupLayoutlayout=newjavax.swing.GroupLayout(getContentPane());getContentPane().setLayout(layout);layout.setHorizontalGroup(layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING).addGroup(layout.createSequentialGroup().addGap(62,62,62).addComponent(txtTelefoneFormatado,javax.swing.GroupLayout.PREFERRED_SIZE,122,javax.swing.GroupLayout.PREFERRED_SIZE).addContainerGap(216,Short.MAX_VALUE)));layout.setVerticalGroup(layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING).addGroup(layout.createSequentialGroup().addGap(83,83,83).addComponent(txtTelefoneFormatado,javax.swing.GroupLayout.PREFERRED_SIZE,javax.swing.GroupLayout.DEFAULT_SIZE,javax.swing.GroupLayout.PREFERRED_SIZE).addContainerGap(197,Short.MAX_VALUE)));pack();}// </editor-fold>//GEN-END:initComponents/** * @param args the command line arguments */publicstaticvoidmain(Stringargs[]){java.awt.EventQueue.invokeLater(newRunnable(){publicvoidrun(){newTesteMascaraTelefone().setVisible(true);}});}// Variables declaration - do not modify//GEN-BEGIN:variablesprivatejavax.swing.JFormattedTextFieldtxtTelefoneFormatado;// End of variables declaration//GEN-END:variables}
Usei Netbeans 6.1
jdk 1.6.0_05
Abraços!
ajfilho
Só corrigindo…
Coloquei assim sem querer:
Mas na verdade só precisa uma vez, porém não influencia na execução do código:
Abraços!
geidivan
Cara, fiz igual a você, mas tá aceitando qualquer coisa e não formata o texto digitado.
Tá difícil viu.
ajfilho
Bom, realmente é estranho.
Olha só, um último teste:
[list]Tem uma propriedade do JFormattedTextField chamada ‘formatterFactory’, verifique se ela está setada como ‘null’. Se não estiver, está impactando na máscara definida anteriormente.[/list]
Abraços
geidivan
Tentei alterar a máscara por ela também mas não consegui.
Por exemplo, se eu coloco: (#)#
Se digito 12 aparece: (12)
Se digito 123456 aparece: (12346)
ajfilho
Bom, como eu disse antes, posta o código aí para eu dar uma olhada.
Abraços!!
geidivan
javax.swing.text.MaskFormatter maskTelFormatado = null;
try {
maskTelFormatado = new javax.swing.text.MaskFormatter("(##)####-####");
} catch (Exception e) {
}
jTTelefone = new javax.swing.JFormattedTextField(maskTelFormatado);
O formatter está null. Chamo isso no ComponentShow, no construtor do form e no formShow.
Já testei um repaint() mas não deu também.
ajfilho
Me diz uma coisa, Você rodou a classe que te passei??
Só gostaria de saber se ela funcionou, independente da sua…
Abraços!
geidivan
Testei, funcionou beleza!
Será que tenho que retirar o componente do meu form e só criar ele quando iniciar o form? Acho que ele não está sobrepondo
o que já existe. Quando faço pelo editor de formato não funciona.
ajfilho
Faz o seguinte:
Apaga esse JformattedTextfield e todos os códigos relacionados a ele;
Depois adiciona um novo e chama como quizeres (txtTelFormatado, se aceitares sugestão);
Clica com o Botão direito no componente e vai em propriedades (ou properties)
Vai na Aba Código (Code) e procura assim Código de Pré-Criação (Pre-Criation Code) e coloca isso:
Em seguida procura na mesma aba assim Código de Criação Personalizado (Custom Create Code) e coloca isso:
Depois compila, limpa teu projeto e roda.
Verifique se assim funciona!!
Abraços!
geidivan
Cesta!!!
Valeu cara, era isso mesmo. O código de criação do componente não estava sendo substituído.
Muito obrigado, ajudou demais.
geidivan
Agora outra dúvida.
Ele não permite que eu delete o conteúdo. Eu deleto, mas quando ele perde o foco, o conteúdo digitado volta.
Como permito o valor nulo?
ajfilho
Você terá que implementar o lostFocus() para ter esse controle, só que o jFormattedTextField já faza isso em background. Provalmente você terá que fazer uma classe q extenda jFormattedTextField e faça suas devidas alterações, de acordo com sua necessidade.
Abraços!!
geidivan
O problema é que não quero que delete sempre que perder o foco. Quero que apague somente quando o usuário deletar o conteúdo do jFormattedTextField.