I fixed it. I realized when an action is handled (i.e. clicking on a button) and an ActionListener's methods are called, they are done so in the event handling thread. There's only one thread, and it can only handle one event at a time. So once it starts running your Robot crap, it can't handle any other events until that event's code is finished.
What you want to do is run your big chunk of code in a separate thread from the event handler. Here's some example code that shows how to do it and how not to do it: http://www.java2s.com/Code/Java/Threads/…
Essentially what you do is you make a new Thread with all your stuff as the implementation of the run() method. If you need to alter any of your Swing components (to set a label to some text, for example) you would do that using SwingUtilities.invokeLater(). The reason you need to do it with invokeLater() instead of in the Thread's run() is because most of Swing is not thread safe; you could cause serious trouble changing Swing components in other threads. invokeLater() ensures that the component-changing code is run in the event handler thread, where it is safe.