Ajuda com o JFormattedTextField

Oi,

Adicionei dois jFormattedTextField (jTelef e um jDat) no meu frame. criei as máscaras e no evento formComponentShown executo o método Mascara(), mas não acontece nada.


import java.text.ParseException;
import javax.swing.JFormattedTextField;
import javax.swing.text.MaskFormatter;


 private MaskFormatter fTelefone;
 private MaskFormatter fData;


public void Mascara() throws ParseException{

  fTelefone = new MaskFormatter("####-####");
  fData = new MaskFormatter("##/##/####");
			
  jTelef = new JFormattedTextField(fTelefone);
  jDat = new JFormattedTextField(fData);

}

Crie os componentes (JFormattedTextfields) usando as mascaras.
Quando seu frame ficar visivel eles vão estar funcionando.

Exemplo:

[code]import javax.swing.JFormattedTextField;
import javax.swing.JFrame;
import javax.swing.text.MaskFormatter;

public class Frame extends JFrame {

private JFormattedTextField jFormattedTextField;

public Frame() {

    try {
        MaskFormatter mask = new MaskFormatter("####-####");
        jFormattedTextField = new JFormattedTextField(mask);
        mask = null;
    } catch (Exception e) {
    }

    getContentPane().add(jFormattedTextField);

    pack();
    setVisible(true);
}

public static void main(String[] args) {
    new Frame();
}

}[/code]
Esquece esse formComponentShown. É gambiarra!

Caso esteja usando o Netbeans. Customize o código de criação das JFormattedTextfield.

try { MaskFormatter mask = new MaskFormatter("####-####"); jFormattedTextField = new JFormattedTextField(mask); mask = null; } catch (Exception e) { }

Coloquei, mas não altera nada. Quando o usuário vai digitar o telefone, não aparece no formato da máscara. Fica como se fosse um jTextField comum.


public Cadadastra_Cliente() {
    initComponents();
    try {    
      MaskFormatter mask = new MaskFormatter("####-####");    
      jTelefone = new JFormattedTextField(mask);    
      mask = null;    
    } catch (Exception e) {    
      }
}

Rodou o exemplo que eu postei?

Rodei outros exemplos que estão funcionando.
Meu sistema está assim:

Menu:

private void jButton3ActionPerformed(java.awt.event.ActionEvent evt) {                                         
    CadastraCliente form_Cliente = new CadastraCliente();
    form_Cliente.setVisible(true);
}    

No CadastraCliente:


    public CadadastraCliente() {
        initComponents();
    try {    
      MaskFormatter mask = new MaskFormatter("(##)####-####");    
      JFormattedTextField jft_Telefone = new JFormattedTextField(mask);   
      jft_Telefone.setColumns(13);
      mask = null;    
    } catch (Exception e) {    
      }
    
    }

estou usando o NetBeans.
Ja adicionei neste projeto uma classe com o seguinte exemplo:

import java.awt.FlowLayout;
import java.text.ParseException;

import javax.swing.JFormattedTextField;
import javax.swing.JFrame;
import javax.swing.text.MaskFormatter;

public class TextFieldComMascara extends JFrame {

	private JFormattedTextField telefone;
	private JFormattedTextField data;
	private MaskFormatter ftmTelefone;
	private MaskFormatter ftmData;
	
	public TextFieldComMascara() throws ParseException{

		ftmTelefone = new MaskFormatter("####-####");
		ftmData = new MaskFormatter("##/##/####");
			
		telefone = new JFormattedTextField(ftmTelefone);
		data = new JFormattedTextField(ftmData);
		
		ftmTelefone.setValidCharacters("0123456789");
		ftmData.setValidCharacters("0123456789");

		telefone.setColumns(6);
		data.setColumns(6);

		add(telefone);
		add(data);

		setLayout(new FlowLayout());
		setDefaultCloseOperation(DISPOSE_ON_CLOSE);
		setSize(200, 200);
		setVisible(true);
	}
	
	public static void main(String[] args) {
		try {
			TextFieldComMascara teste = new TextFieldComMascara();		
		}catch (ParseException e) {
			e.printStackTrace();
		}
	}

}

Também está funcionando.

Mas quando eu passo para minha classe o JFormattedTextField, não fica formatado. Será por que eu criei a frame no Netbeans? Pois no exemplo acima está sendo criado todo no main().

Criei o exemplo que você enviou, mas não aparece nada.

package teste;

import java.text.ParseException;  
import javax.swing.JFormattedTextField;  
import javax.swing.text.MaskFormatter;  
  
public class Mascara extends javax.swing.JFrame {

private MaskFormatter fTelefone;  
private MaskFormatter fData;  
  
 public void Mascara() throws ParseException{  
   initComponents();
   
   fTelefone = new MaskFormatter("####-####");  
   fData = new MaskFormatter("##/##/####");  
              
   jTelef = new JFormattedTextField(fTelefone);  
   jDat = new JFormattedTextField(fData);  
 }

    @SuppressWarnings("unchecked")
    // <editor-fold defaultstate="collapsed" desc="Generated Code">
    private void initComponents() {

        jTelef = new javax.swing.JFormattedTextField();
        jDat = new javax.swing.JFormattedTextField();

        setDefaultCloseOperation(javax.swing.WindowConstants.EXIT_ON_CLOSE);

        jTelef.setText("jFormattedTextField1");

        jDat.setText("jFormattedTextField1");

        javax.swing.GroupLayout layout = new javax.swing.GroupLayout(getContentPane());
        getContentPane().setLayout(layout);
        layout.setHorizontalGroup(
            layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
            .addGroup(layout.createSequentialGroup()
                .addGroup(layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
                    .addGroup(layout.createSequentialGroup()
                        .addGap(127, 127, 127)
                        .addComponent(jTelef, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE))
                    .addGroup(layout.createSequentialGroup()
                        .addGap(137, 137, 137)
                        .addComponent(jDat, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE)))
                .addContainerGap(154, Short.MAX_VALUE))
        );
        layout.setVerticalGroup(
            layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
            .addGroup(layout.createSequentialGroup()
                .addGap(63, 63, 63)
                .addComponent(jTelef, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE)
                .addGap(18, 18, 18)
                .addComponent(jDat, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE)
                .addContainerGap(179, Short.MAX_VALUE))
        );

        pack();
    }// </editor-fold>

    /**
    * @param args the command line arguments
    */
    public static void main(String args[]) {
        java.awt.EventQueue.invokeLater(new Runnable() {
            public void run() {
                new Mascara().setVisible(true);
            }
        });
    }

    // Variables declaration - do not modify
    private javax.swing.JFormattedTextField jDat;
    private javax.swing.JFormattedTextField jTelef;
    // End of variables declaration

}

Outra dúvida:

Quando o Frame aparecer o JFormattedTextField já aparece formatado? ou ele só formata depois que o usuário digitar os dados?