Non essendo molto pratico di questo tipo di componenti ti stavo probabilmente indirizzando male, è necessario lavorare sul document.
Occorre comunque chiarire una cosa. Nella tua chat le emoticon devono essere sostituite "al volo" in fase di digitazione oppure devi avere un box separato che fa solo visualizzazione appendendo il testo digitato in un altro box in coda e mostrando come emoticon i pattern corrispondenti digitati in tale box?
Nel primo caso puoi seguire questo esempio (implementato con un JEditorPane ma funziona anche con un JTextPane).
Nel secondo caso puoi a mio avviso seguire un approccio simile aggiungendo un listener al box di visualizzazione e lavorando solo sulla stringa in append.