Io ho risolto in questo modo.

Ho creato una classe, RemovePatternCharHandler, che implementa KeyListener ed ho scritto il seguente codice per ogni evento:
codice:
// Mostro solo keyPressed, ma vale anche per 
// keyReleased e keyTyped
keyPressed(KeyEvent e) {
   try {
   
      javax.swing.text.JTextComponent jTC = (javax.swing.text.JTextComponent) getSource();
      jTC.setText(jTC.getText().replaceAll(pattern,""));

} catch(Exception ex) {}

}

RemovePatternCharHandler ha un costruttore che setta la variabile patter, privata, che specifica quali caratteri accettare.

codice:
public class RemovePatternCharHandler implements KeyListener {

private String pattern = "";
.
.
.

public RemovePatternCharHandler(String pattern) {
    this.pattern = pattern;
}

}

A questo punto basta aggiungere ad ogni JTextField un KeyListner in questo modo.

codice:
JTextField jTF = new JTextField()

.
.
.

jTF.addKeyListener(new RemovePatternCharHandler("[^\\d|.]"));
In questo modo dovrebbe permettere di inserire solo caratteri di tipo DIGIT ed il punto, solo che permette di metterne più di uno.

In generale puoi, con una buona espressione regolare, limitare l'inserimento di qualsiasi carattere, ma non formattarlo.

Che ne dici??