There's also this approach to avoid relaying in the robot:
import java.awt.*;
import java.awt.event.KeyEvent;
import javax.swing.*;
public class KeyEventTest
{
    public static void main(String[] args)
    {
        final JTextField textField = new JTextField(8);
        textField.setFont(textField.getFont().deriveFont(18f));
        JPanel panel = new JPanel(new GridBagLayout());
        panel.add(textField, new GridBagConstraints());
        JFrame f = new JFrame();
        f.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        f.getContentPane().add(panel);
        f.setSize(300,160);
        f.setLocation(200,200);
        f.setVisible(true);
        new Thread(new Runnable()
        {
            public void run()
            {
                Toolkit toolkit = Toolkit.getDefaultToolkit();
                EventQueue queue = toolkit.getSystemEventQueue();
                try {
                    Thread.sleep(1500);
                } catch(InterruptedException ie) { }
                char newChar = 'x';
                queue.postEvent(new KeyEvent(textField,
                                             KeyEvent.KEY_TYPED,
                                             System.currentTimeMillis(),
                                             0,
                                             KeyEvent.VK_UNDEFINED,
                                             newChar));
                try {
                    Thread.sleep(1500);
                } catch(InterruptedException ie) { }
                queue.postEvent(new KeyEvent(textField,
                                             KeyEvent.KEY_PRESSED,
                                             System.currentTimeMillis(),
                                             0,
                                             KeyEvent.VK_BACK_SPACE,
                                             KeyEvent.CHAR_UNDEFINED));
            }
        }).start();
    }
}
I must warn you that if the component loses the focus the generated events will be lost! D: