Devi definire un tuo Document personalizzato. Ad esempio definisci una classe NumericPlainDocument che estende PlainDocument. In questa classe ridefinisci il metodo insertString(...) :

codice:
import javax.swing.text.AttributeSet;
import javax.swing.text.BadLocationException;
import javax.swing.text.PlainDocument;

public class NumericPlainDocument extends PlainDocument {
     public void insertString (int offset, String  str, AttributeSet attr) throws BadLocationException {
          if (str == null) return;
          if ((getLength() + str.length()) <= 3) {
               char c = str.toCharArray()[0];
               if (((Character.isDigit(c) || (c == java.awt.event.KeyEvent.VK_BACK_SPACE) ||  (c == java.awt.event.KeyEvent.VK_DELETE)))) {
                        super.insertString(offset, str, attr);
               }
          }
          
     }
}
Quindi impostare questo Document come documento del tuo JTextField:

codice:
tuoJTextField.setDocument(new NumericPlainDocument());