El patrón funciona adecuadamente. Siempre. Somos nosotros los que no funcionamos adecuadamente.
El error de tu código está acá:
¿Por qué, ánima bendita, estás utilizando la clase Float?
Te presento a una clase, se llama BigDecimal.
Por favor, investiga sobre en qué casos utilizar Float, en qué casos Double y en qué casos BigDecimal. En tu caso los decimales son importantes porque estás trabajando con dinero. ¿Cómo pues, confías en Float?
Tu código funcionará bien reemplazando lo anterior por esto:
Pero que funcione bien, no lo hace eficiente. Te aconsejo no usar el simple JTextField para trabajar con datos numéricos. Crea tu propia clase que extienda de JFormattedTextField para manejar números. Así no tendrás que hacer esas "validaciones" cada vez que crees un nuevo campo para un valor numérico.