Queria fazer uma formatação de máscara para moeda similar ao de Imposto de Renda, permitindo apenas a digitação de números, pontos e vírgula. Então tendei fazer isto com o seguinte código:
java.text.DecimalFormat decimal = new java.text.DecimalFormat("#,###,##0.00");
javax.swing.JFormattedTextField teste = new javax.swing.JFormattedTextField(decimal);
try{
javax.swing.text.MaskFormatter formatar = new javax.swing.text.MaskFormatter("**************");
formatar.setValidCharacters("0123456789.,");
formatar.install(teste);
}catch(Exception ex){
}
teste.setHorizontalAlignment(javax.swing.JTextField.RIGHT);
Ele funciona bem na primeira vez que o usuário entra no campo, mas se o usuário retornar ao campo para corrigir algum dado o campo perde o MaskFormatter e permite a digitação de outros caracteres além do que é pra ser permitido.
Alguém sabe como posso resolver isso?
Galera consegui resolver o problema de uma maneira simples e boa pro usuário trabalhar, segue o código:
java.text.DecimalFormat decimal = new java.text.DecimalFormat("#,###,###.00");
javax.swing.text.NumberFormatter numFormatter = new javax.swing.text.NumberFormatter(decimal);
numFormatter.setFormat(decimal);
numFormatter.setAllowsInvalid(false);
javax.swing.JFormattedTextField teste = new javax.swing.JFormattedTextField();
teste.setFormatterFactory(new javax.swing.text.DefaultFormatterFactory(numFormatter));
teste.setHorizontalAlignment(javax.swing.JTextField.TRAILING);
Esse modelo funciona muito bem até de uma forma melhor da que procurava.