Problema com dele e backspace em JFormattedTextField (quando texto selecionado)

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