Devi creare un custom Document (estendendo da PlainDocument), fare l'override del metodo insertString() in modo che effettui l'inserimento se e solo se la lunghezza della stringa finora inserita è 0. Quindi, assegnare questo custom Document alla JTextField.

codice:
class OneCharPlainDocument extends PlainDocument {
    public void insertString(int offs, String str, AttributeSet a) throws BadLocationException {
        if (str == null || "".equals(str)) {
            return;
        }
        str = str.substring(0, 1);
        if (getLength() > 0) {
            // Non aggiungiamo nulla
            str = "";
        }

        super.insertString(offs, str, a);
    }
}
Quindi assegnerai come Document di JTextField un'istanza di tale classe.

E' un esempio scritto al volo... non l'ho verificato.

Ciao.