Потому что надо выполнять операции обновления интерфейса после каждой добавленной буквы.
Через таймер нужно так:
Надо временную переменную в которой будет храниться текст который не выведен.
Таймер вызывается каждые 300 миллисекунд берет первый символ из этой переменной и добавляет к тексту. Переменную меняет на на все что после первого символа. Если переменная стала пустой - таймер остановить, так как текст из переменной плавно перетек в поле.