Netbeans - Máscara para telefone não funciona

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.

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.

Posta tua classe então para ver como tu aplicaste essa máscara.

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!

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.

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)

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.

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.

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?

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.