Problemas com JFormattedTextField

Boa noite, amigos

Com a ajuda dos colegas do GUJ, consegui “mascarar” um campo de texto. Vejam meu código:

jTValor = new javax.swing.JFormattedTextField(); try { ftmValor = new MaskFormatter("###,##"); } catch (ParseException ex) { JOptionPane.showMessageDialog(null, "Digite apenas números. Não digite . ou ,"); } jTValor = new JFormattedTextField(ftmValor); ftmValor.setValidCharacters("0123456789"); add(jTValor); jTValor.addActionListener(new java.awt.event.ActionListener() { public void actionPerformed(java.awt.event.ActionEvent evt) { jTValorActionPerformed(evt); } });
Minha dúvida é: se eu deixar o MaskFormatter do jeito que está (###,##) só consigo colocar valores tipo 100, 200, 300 etc. Não conseguirei colocar 1,00 ou 10,00. Como eu posso alterar o MaskFormatter para aceitar qualquer valor, mantendo as duas casas decimais?

Um abraço.

Não sei se existe algo pronto, mas você pode utilizar um inputVerifier. Por exemplo:

class FormattedTextFieldVerifier extends InputVerifier {
	static DecimalFormat df = new DecimalFormat("###.00", new DecimalFormatSymbols(new Locale("pt","br")));
	
    public boolean verify(JComponent input) {
        if (input instanceof JFormattedTextField) {
            JFormattedTextField ftf = (JFormattedTextField)input;
            AbstractFormatter formatter = ftf.getFormatter();
            if (formatter != null) {
                String text = ftf.getText();
                if ( !text.endsWith(",00" )) {
                	int indice = text.indexOf(",");
                	String tmp = text.substring(indice, text.length());
                	tmp = tmp.replaceAll(" ", "0");
                	text = text.substring(0, indice) + tmp;
                }
            	try {
					df.parse(text);
                	ftf.setText(text);
				} catch (ParseException e) {
					// TODO Auto-generated catch block
					e.printStackTrace();
					JOptionPane.showMessageDialog(null, "Valor inválido!");
					return false;
				}
            }
         }
         return true;
     }
     public boolean shouldYieldFocus(JComponent input) {
         return verify(input);
     }
 }

e no objeto JFormattedTextField você chama o método setInputVerifier:


MaskFormatter fmtValor = new MaskFormatter("###,##");
JFormattedTextField tf = new JFormattedTextField(  fmtValor );
fmtValor.setValidCharacters("0123456789");                  
tf.setInputVerifier(new FormattedTextFieldVerifier());

Essa classe te dá uma idéia do que pode ser feito, porém o método verify deve ser alterado
dependendo do tipo de formatação/validação. No exemplo ele vai validar desde que você coloque os três
primeiros números. Neste caso ele completa com “00” no final.

Até mais.

Bom dia,

Testei o código do colega acima, e deu o seguinte erro:

Exception in thread "AWT-EventQueue-0" java.lang.NullPointerException at forms.FormClaro.initComponents(FormClaro.java:90) at forms.FormClaro.<init>(FormClaro.java:34) at forms.FormClaro$7.run(FormClaro.java:366) at java.awt.event.InvocationEvent.dispatch(InvocationEvent.java:209) at java.awt.EventQueue.dispatchEvent(EventQueue.java:597) at java.awt.EventDispatchThread.pumpOneEventForFilters(EventDispatchThread.java:269) at java.awt.EventDispatchThread.pumpEventsForFilter(EventDispatchThread.java:184) at java.awt.EventDispatchThread.pumpEventsForHierarchy(EventDispatchThread.java:174) at java.awt.EventDispatchThread.pumpEvents(EventDispatchThread.java:169) at java.awt.EventDispatchThread.pumpEvents(EventDispatchThread.java:161) at java.awt.EventDispatchThread.run(EventDispatchThread.java:122) CONSTRUÍDO COM SUCESSO (tempo total: 3 segundos)
Minha classe ficou assim:

[code]package forms;

import dao.VendaDAO;
import java.sql.SQLException;
import java.text.ParseException;
import java.text.SimpleDateFormat;
import java.util.Date;
import javax.swing.JFormattedTextField;
import javax.swing.JOptionPane;
import javax.swing.text.MaskFormatter;
import modelos.DadosDaVenda;

/**
*

  • @author marcus
    */
    public class FormClaro extends javax.swing.JFrame {
    private MaskFormatter ftmValor;

    /** Creates new form FormClaro */
    public FormClaro() {
    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”)
      //
      private void initComponents() {

      jLabel1 = new javax.swing.JLabel();
      jPanel1 = new javax.swing.JPanel();
      jLabel2 = new javax.swing.JLabel();
      jTCodigo = new javax.swing.JTextField();
      jLabel4 = new javax.swing.JLabel();
      jTValor = new javax.swing.JFormattedTextField();
      jLabel5 = new javax.swing.JLabel();
      jTNdc = new javax.swing.JTextField();
      jLabel7 = new javax.swing.JLabel();
      jTLoja = new javax.swing.JTextField();
      jLabel8 = new javax.swing.JLabel();
      jTData = new javax.swing.JTextField();
      jLabel9 = new javax.swing.JLabel();
      jTHora = new javax.swing.JTextField();
      jPanel2 = new javax.swing.JPanel();
      jLabel6 = new javax.swing.JLabel();
      jTOperadora = new javax.swing.JTextField();
      jLabel10 = new javax.swing.JLabel();
      jTDdd = new javax.swing.JTextField();
      jLabel11 = new javax.swing.JLabel();
      jTNumero = new javax.swing.JTextField();
      jLabel12 = new javax.swing.JLabel();
      jBSalvar = new javax.swing.JButton();
      jMenuBar1 = new javax.swing.JMenuBar();
      jMenu1 = new javax.swing.JMenu();
      jMenuItem1 = new javax.swing.JMenuItem();

      setDefaultCloseOperation(javax.swing.WindowConstants.EXIT_ON_CLOSE);
      setTitle(“Recarga: Operadora Claro /+/LaraSoft/+/”);

      jLabel1.setIcon(new javax.swing.ImageIcon(getClass().getResource("/forms/icone_claro.jpg"))); // NOI18N

      jPanel1.setBorder(javax.swing.BorderFactory.createTitledBorder(“Dados da venda”));

      jLabel2.setText(“Código do vendedor:”);

      jLabel4.setText(“Valor da recarga:”);

      try {
      MaskFormatter ftmValor = new MaskFormatter("###,##");
      } catch (ParseException ex) {
      JOptionPane.showMessageDialog(null, “Digite apenas números. Não digite . ou ,”);
      }
      JFormattedTextField tf = new JFormattedTextField(ftmValor);
      ftmValor.setValidCharacters(“0123456789”);
      tf.setInputVerifier(new FormattedTextFieldVerifier());
      jTValor.addActionListener(new java.awt.event.ActionListener() {
      public void actionPerformed(java.awt.event.ActionEvent evt) {
      jTValorActionPerformed(evt);
      }
      });

      javax.swing.GroupLayout jPanel1Layout = new javax.swing.GroupLayout(jPanel1);
      jPanel1.setLayout(jPanel1Layout);
      jPanel1Layout.setHorizontalGroup(
      jPanel1Layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
      .addGroup(jPanel1Layout.createSequentialGroup()
      .addContainerGap()
      .addGroup(jPanel1Layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
      .addComponent(jLabel2)
      .addComponent(jLabel4))
      .addGap(18, 18, 18)
      .addGroup(jPanel1Layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING, false)
      .addComponent(jTCodigo)
      .addComponent(jTValor, javax.swing.GroupLayout.DEFAULT_SIZE, 75, Short.MAX_VALUE))
      .addContainerGap(530, Short.MAX_VALUE))
      );
      jPanel1Layout.setVerticalGroup(
      jPanel1Layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
      .addGroup(jPanel1Layout.createSequentialGroup()
      .addContainerGap()
      .addGroup(jPanel1Layout.createParallelGroup(javax.swing.GroupLayout.Alignment.TRAILING)
      .addComponent(jLabel2)
      .addComponent(jTCodigo, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE))
      .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED)
      .addGroup(jPanel1Layout.createParallelGroup(javax.swing.GroupLayout.Alignment.BASELINE)
      .addComponent(jLabel4)
      .addComponent(jTValor, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE))
      .addContainerGap(javax.swing.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE))
      );

      jLabel5.setText(“NDC:”);

      jTNdc.setEditable(false);
      jTNdc.setFocusable(false);

      jLabel7.setText(“Loja:”);

      jTLoja.setEditable(false);
      jTLoja.setText(“3”);
      jTLoja.setFocusable(false);
      jTLoja.addActionListener(new java.awt.event.ActionListener() {
      public void actionPerformed(java.awt.event.ActionEvent evt) {
      jTLojaActionPerformed(evt);
      }
      });

      jLabel8.setText(“Data:”);

      SimpleDateFormat format = new SimpleDateFormat(“dd/MM/yyyy”);
      jTData.setText(format.format(new Date()));
      jTData.setEditable(false);
      jTData.setFocusable(false);
      jTData.addActionListener(new java.awt.event.ActionListener() {
      public void actionPerformed(java.awt.event.ActionEvent evt) {
      jTDataActionPerformed(evt);
      }
      });

      jLabel9.setText(“Hora:”);

      SimpleDateFormat sdf = new SimpleDateFormat(“HH:mm”);
      jTHora.setText(sdf.format(new Date()));
      jTHora.setEditable(false);
      jTHora.setFocusable(false);

      jPanel2.setBorder(javax.swing.BorderFactory.createTitledBorder(“Informações da recarga”));

      jLabel6.setText(“Operadora:”);

      jTOperadora.setEditable(false);
      jTOperadora.setText(“Claro”);
      jTOperadora.setFocusable(false);

      jLabel10.setText(“DDD:”);

      jTDdd.setText(“24”);

      jLabel11.setText(“Número do celular*:”);

      jLabel12.setText("* Apenas números, sem traços");

      javax.swing.GroupLayout jPanel2Layout = new javax.swing.GroupLayout(jPanel2);
      jPanel2.setLayout(jPanel2Layout);
      jPanel2Layout.setHorizontalGroup(
      jPanel2Layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
      .addGroup(jPanel2Layout.createSequentialGroup()
      .addContainerGap()
      .addGroup(jPanel2Layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
      .addComponent(jLabel6)
      .addComponent(jLabel10)
      .addComponent(jLabel11))
      .addGap(18, 18, 18)
      .addGroup(jPanel2Layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
      .addGroup(jPanel2Layout.createSequentialGroup()
      .addComponent(jTNumero, javax.swing.GroupLayout.PREFERRED_SIZE, 144, javax.swing.GroupLayout.PREFERRED_SIZE)
      .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED)
      .addComponent(jLabel12))
      .addComponent(jTOperadora, javax.swing.GroupLayout.PREFERRED_SIZE, 76, javax.swing.GroupLayout.PREFERRED_SIZE)
      .addComponent(jTDdd, javax.swing.GroupLayout.PREFERRED_SIZE, 38, javax.swing.GroupLayout.PREFERRED_SIZE))
      .addGap(252, 252, 252))
      );
      jPanel2Layout.setVerticalGroup(
      jPanel2Layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
      .addGroup(jPanel2Layout.createSequentialGroup()
      .addGroup(jPanel2Layout.createParallelGroup(javax.swing.GroupLayout.Alignment.BASELINE)
      .addComponent(jLabel6)
      .addComponent(jTOperadora, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE))
      .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED)
      .addGroup(jPanel2Layout.createParallelGroup(javax.swing.GroupLayout.Alignment.BASELINE)
      .addComponent(jLabel10)
      .addComponent(jTDdd, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE))
      .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED, javax.swing.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE)
      .addGroup(jPanel2Layout.createParallelGroup(javax.swing.GroupLayout.Alignment.BASELINE)
      .addComponent(jLabel11)
      .addComponent(jTNumero, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE)
      .addComponent(jLabel12))
      .addGap(24, 24, 24))
      );

      jBSalvar.setText(“Registrar venda”);
      jBSalvar.addActionListener(new java.awt.event.ActionListener() {
      public void actionPerformed(java.awt.event.ActionEvent evt) {
      jBSalvarActionPerformed(evt);
      }
      });

      jMenuBar1.setBackground(java.awt.Color.orange);
      jMenuBar1.setForeground(java.awt.Color.orange);

      jMenu1.setText(“Opções”);
      jMenu1.addActionListener(new java.awt.event.ActionListener() {
      public void actionPerformed(java.awt.event.ActionEvent evt) {
      jMenu1ActionPerformed(evt);
      }
      });

      jMenuItem1.setAccelerator(javax.swing.KeyStroke.getKeyStroke(java.awt.event.KeyEvent.VK_T, java.awt.event.InputEvent.CTRL_MASK));
      jMenuItem1.setText(“Trocar operadora”);
      jMenuItem1.addActionListener(new java.awt.event.ActionListener() {
      public void actionPerformed(java.awt.event.ActionEvent evt) {
      jMenuItem1ActionPerformed(evt);
      }
      });
      jMenu1.add(jMenuItem1);

      jMenuBar1.add(jMenu1);

      setJMenuBar(jMenuBar1);

      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()
      .addContainerGap()
      .addComponent(jPanel1, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE))
      .addGroup(layout.createSequentialGroup()
      .addComponent(jLabel1)
      .addGap(18, 18, 18)
      .addComponent(jLabel5)
      .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED)
      .addComponent(jTNdc, javax.swing.GroupLayout.PREFERRED_SIZE, 115, javax.swing.GroupLayout.PREFERRED_SIZE)
      .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED)
      .addComponent(jLabel7)
      .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED)
      .addComponent(jTLoja, javax.swing.GroupLayout.PREFERRED_SIZE, 34, javax.swing.GroupLayout.PREFERRED_SIZE)
      .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED)
      .addComponent(jLabel8)
      .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED)
      .addComponent(jTData, javax.swing.GroupLayout.PREFERRED_SIZE, 10, javax.swing.GroupLayout.PREFERRED_SIZE)
      .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED)
      .addComponent(jLabel9)
      .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED)
      .addComponent(jTHora, javax.swing.GroupLayout.PREFERRED_SIZE, 100, javax.swing.GroupLayout.PREFERRED_SIZE))
      .addGroup(layout.createSequentialGroup()
      .addContainerGap()
      .addGroup(layout.createParallelGroup(javax.swing.GroupLayout.Alignment.TRAILING)
      .addComponent(jPanel2, javax.swing.GroupLayout.Alignment.LEADING, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE)
      .addGroup(javax.swing.GroupLayout.Alignment.LEADING, layout.createSequentialGroup()
      .addGap(315, 315, 315)
      .addComponent(jBSalvar)
      .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED, 348, Short.MAX_VALUE)))))
      .addContainerGap())
      );

      layout.linkSize(javax.swing.SwingConstants.HORIZONTAL, new java.awt.Component[] {jTData, jTHora});

      layout.setVerticalGroup(
      layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
      .addGroup(layout.createSequentialGroup()
      .addGroup(layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
      .addComponent(jLabel1)
      .addGroup(layout.createSequentialGroup()
      .addContainerGap()
      .addGroup(layout.createParallelGroup(javax.swing.GroupLayout.Alignment.BASELINE)
      .addComponent(jLabel5)
      .addComponent(jTNdc, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE)
      .addComponent(jLabel7)
      .addComponent(jTLoja, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE)
      .addComponent(jLabel8)
      .addComponent(jTData, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE)
      .addComponent(jLabel9)
      .addComponent(jTHora, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE))))
      .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED)
      .addComponent(jPanel1, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE)
      .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED)
      .addComponent(jPanel2, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE)
      .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED)
      .addComponent(jBSalvar)
      .addContainerGap(javax.swing.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE))
      );

      pack();
      }//

    private void jMenu1ActionPerformed(java.awt.event.ActionEvent evt) {
    // TODO add your handling code here:
    }

    private void jMenuItem1ActionPerformed(java.awt.event.ActionEvent evt) {
    // TODO add your handling code here:
    Formulario principal = new Formulario();
    principal.setVisible(true);
    }

    private void jTDataActionPerformed(java.awt.event.ActionEvent evt) {
    // TODO add your handling code here:
    }

    private void jBSalvarActionPerformed(java.awt.event.ActionEvent evt) {
    try {
    // TODO add your handling code here:
    DadosDaVenda dv1 = new DadosDaVenda();
    dv1.setNdc(jTNdc.getText());
    dv1.setLoja(“3”);
    dv1.setDia(jTData.getText());
    dv1.setHora(jTHora.getText());
    dv1.setVendedor(jTCodigo.getText());
    dv1.setValor(jTValor.getText());
    dv1.setOperadora(jTOperadora.getText());
    dv1.setDdd(jTDdd.getText());
    dv1.setNumeroCelular(jTNumero.getText());
    VendaDAO dao = new VendaDAO();
    dao.adiciona(dv1);
    } catch (SQLException ex) {
    JOptionPane.showMessageDialog(null, “Verifique se todos os campos foram preenchidos.”);
    }
    JOptionPane.showMessageDialog(null, “Venda registrada com sucesso. Para sua segurança, anote a NDC no comprovante.”);
    System.exit(1);

    }

    private void jTLojaActionPerformed(java.awt.event.ActionEvent evt) {
    // TODO add your handling code here:
    }

    private void jTValorActionPerformed(java.awt.event.ActionEvent evt) {

}

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

        public void run() {
            new FormClaro().setVisible(true);
        }
    });
}
// Variables declaration - do not modify
private javax.swing.JButton jBSalvar;
private javax.swing.JLabel jLabel1;
private javax.swing.JLabel jLabel10;
private javax.swing.JLabel jLabel11;
private javax.swing.JLabel jLabel12;
private javax.swing.JLabel jLabel2;
private javax.swing.JLabel jLabel4;
private javax.swing.JLabel jLabel5;
private javax.swing.JLabel jLabel6;
private javax.swing.JLabel jLabel7;
private javax.swing.JLabel jLabel8;
private javax.swing.JLabel jLabel9;
private javax.swing.JMenu jMenu1;
private javax.swing.JMenuBar jMenuBar1;
private javax.swing.JMenuItem jMenuItem1;
private javax.swing.JPanel jPanel1;
private javax.swing.JPanel jPanel2;
private javax.swing.JTextField jTCodigo;
private javax.swing.JTextField jTData;
private javax.swing.JTextField jTDdd;
private javax.swing.JTextField jTHora;
private javax.swing.JTextField jTLoja;
private javax.swing.JTextField jTNdc;
private javax.swing.JTextField jTNumero;
private javax.swing.JTextField jTOperadora;
private javax.swing.JFormattedTextField jTValor;
// End of variables declaration

}
[/code]
O que fiz de errado?

Abraço.

rogeriopaguilar,

Consegui, amigão. Muito obrigado!

Abração.

Voltando ao problema, testei no NetBeans, e o valor é formatado corretamente. Só que fui visualizar os registros no banco de dados, e o campo valor está em branco. O estranho é que é um campo não nulo, as outras informações foram salvas normalmente.

Por que será, já que não me aparece nenhuma mensagem de erro?

O tipo de campo valor no banco é VARCHAR, e meu código ficou:

jTValor = new javax.swing.JFormattedTextField(); DecimalFormat df = new DecimalFormat("###.00", new DecimalFormatSymbols(new Locale("pt","br"))); JFormattedTextField jTValor = new JFormattedTextField(new NumberFormatter(df)); jTValor.addActionListener(new java.awt.event.ActionListener() { public void actionPerformed(java.awt.event.ActionEvent evt) { jTValorActionPerformed(evt); } });