Alex'87 ha risposto prima di me ma anche io avrei suggerito di guardare javax.swing.InputVerifier.
La questione del focusLost() è che quando avviene, il focus è già stato "perso" per un istante e non puoi impedire quest'evento. Certo ... nessuno vieta di fare, nel focusLost, la validazione e se l'input è errato ridare il focus al text field.
Ma c'è una differenza tra usare questo approccio e usare un InputVerifier. Se il focus è nel text field e l'input è invalido e premi TAB per passare al componente successivo, anche se nel focusLost ridai il focus al text field, il componente successivo riceve comunque il focusGained.
Con InputVerifier no, il focus non si "schioda" dal text field.

Rispondi quotando