Pessoal,
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 “(00)0000-0000” 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.
Obrigado.
ajfilho
Dezembro 3, 2008, 12:47pm
#2
Tente colocar assim:
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!
Como disse, não funcionou.
Ele entende o # como um conjunto de caracteres e os parenteses e ifen não aparecem.
ajfilho
Dezembro 3, 2008, 1:05pm
#4
Posta tua classe então para ver como tu aplicaste essa máscara.
ajfilho
Dezembro 3, 2008, 1:11pm
#5
Olha o exemplo que fiz. Funciona que é uma maravilha 8)
[code]/*
TesteMascaraTelefone.java
Created on December 3, 2008, 1:29 PM
*/
/**
*
@author AJFILHO
*/
public class TesteMascaraTelefone extends javax.swing.JFrame {
/** Creates new form TesteMascaraTelefone */
public TesteMascaraTelefone() {
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”)
// //GEN-BEGIN:initComponents
private void initComponents() {
javax.swing.text.MaskFormatter maskTelFormatado = null;
try {
maskTelFormatado = new javax.swing.text.MaskFormatter("(##)####- ####");
} catch (java.text.ParseException exc) {
}
txtTelefoneFormatado = txtTelefoneFormatado = new javax.swing.JFormattedTextField(maskTelFormatado);
setDefaultCloseOperation(javax.swing.WindowConstants.EXIT_ON_CLOSE);
javax.swing.GroupLayout layout = new javax.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();
}// //GEN-END:initComponents
/**
@param args the command line arguments
*/
public static void main(String args[]) {
java.awt.EventQueue.invokeLater(new Runnable() {
public void run() {
new TesteMascaraTelefone().setVisible(true);
}
});
}
// Variables declaration - do not modify//GEN-BEGIN:variables
private javax.swing.JFormattedTextField txtTelefoneFormatado;
// End of variables declaration//GEN-END:variables
}[/code]
Usei Netbeans 6.1
jdk 1.6.0_05
Abraços!
ajfilho
Dezembro 3, 2008, 1:15pm
#6
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!
Cara, fiz igual a você, mas tá aceitando qualquer coisa e não formata o texto digitado.
Tá difícil viu.
ajfilho
Dezembro 3, 2008, 1:37pm
#8
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
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
Dezembro 3, 2008, 1:49pm
#10
Bom, como eu disse antes, posta o código aí para eu dar uma olhada.
Abraços!!
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
Dezembro 3, 2008, 2:13pm
#12
Me diz uma coisa, Você rodou a classe que te passei??
Só gostaria de saber se ela funcionou, independente da sua…
Abraços!
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
Dezembro 3, 2008, 2:35pm
#14
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:
javax.swing.text.MaskFormatter maskTelFormatado = null;
try {
maskTelFormatado = new javax.swing.text.MaskFormatter("(##)####-####");
} catch (java.text.ParseException exc) {
}
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!
Cesta!!!
Valeu cara, era isso mesmo. O código de criação do componente não estava sendo substituído.
Muito obrigado, ajudou demais.
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
Dezembro 4, 2008, 12:22pm
#17
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!!
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.