Bom dia pessoal.
Sou novato em Java Swing e estou apanhando para descobrir uma solução para o seguinte problema:
Criei um JFormattedTextField (tem que ser JFormatted devido a necessidade do sistema), nele atribui um DefaultFormatterFactory para formatar números inteiros em Digitação e em outro caso, na perda de foco do componente.
Este DefaultFormatterFactory recebe em seu construtor um NumberFormatter; o numberF tem uma propriedade chamada AllowsInvalid. Pois bem, para que meu número seja formatado em tempo de digitação este AllowsInvalid tem que estar setado como “false”. Com isto o número é formatado a medida que o usuário vai digitando só que, aqui, vem o problema. Quando o campo perde o foco e posterior recebe o foco eu seleciono o número inteiro com o selectAll, mas, caso eu tecle delete ou backspace, nada acontece.
Fiz um teste passando o AllowsInvalid para “true”, só que o número não mais é formatado em tempo de digitação e sim na perda de foco do JFormatted, mas, assim o delete e o backspace funcionam.
Alguém já passou por isso e conseguiu resolver???
Eu fiz um teste criando um ActionMap para as teclas delete e backspace e funcionou, mas, não queria deixar o código assim, gostaria de encontrar uma outra forma tipo, uma propriedade que desconheço que setada faça com que os campos funcionem.
Outro problema que estou encontrando é que quando o backspace funciona ele não apaga o último dígito do número.
Segue o código:
package campoNumerico;
import java.awt.Dimension;
import java.awt.FlowLayout;
import java.awt.event.FocusAdapter;
import java.awt.event.FocusEvent;
import java.text.DecimalFormat;
import java.text.DecimalFormatSymbols;
import javax.swing.JButton;
import javax.swing.JFormattedTextField;
import javax.swing.JFrame;
import javax.swing.JLabel;
import javax.swing.JPanel;
import javax.swing.SwingUtilities;
import javax.swing.text.DefaultFormatterFactory;
import javax.swing.text.NumberFormatter;
public class FormataDigInt extends JFrame{
private static final long serialVersionUID = 1L;
private JFormattedTextField jf = new JFormattedTextField();
private JButton jb = new JButton("Foco");
private JLabel jl = new JLabel();
public FormataDigInt(){
super("Formatadores");
FlowLayout layout = new FlowLayout();
JPanel c = (JPanel)getContentPane();
c.setLayout(layout);
jl.setText("Aplica formatação em inteiros durante a digitação");
DecimalFormatSymbols symbols = new DecimalFormatSymbols();
symbols.setDecimalSeparator(',');
symbols.setGroupingSeparator('.');
DefaultFormatterFactory dfFactory = new DefaultFormatterFactory(getFormatter("#,###", symbols));
jf.setFormatterFactory(dfFactory);
jf.setPreferredSize(new Dimension(250,20));
jf.setHorizontalAlignment(JFormattedTextField.RIGHT);
jf.setFocusLostBehavior(JFormattedTextField.COMMIT);
jf.addFocusListener(new FocusAdapter(){
public void focusGained(FocusEvent e) {
SwingUtilities.invokeLater(new Runnable() {
public void run() {
jf.selectAll();
}
});
}
});
c.add(jl);
c.add(jf);
c.add(jb);
}
private NumberFormatter getFormatter(String mascara, DecimalFormatSymbols symbols) {
DecimalFormat decimalFormat = new DecimalFormat(mascara, symbols);
NumberFormatter numFormatter = new NumberFormatter();
numFormatter.setFormat(decimalFormat);
numFormatter.setAllowsInvalid(true);
return numFormatter;
}
public static void main (String args[]){
FormataDigInt obj = new FormataDigInt();
obj.setSize(286,165);
obj.setLocationRelativeTo(null);
obj.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
obj.setVisible(true);
}
}
Alguém pode me ajudar???
Desde já agradeço a atenção de todos.
Abraços, Fabrício