I learned about how swing isn\'t thread-safe. Delving deeper, I discovered that every modification to a swing component must be done on the Event Dispatch Thread in order to
Not all your UI code must be part of a runnable in an invokeLater call. That is simply because a large part of your program will be run on the EDT anyway. You need to dispatch messages to the EDT only when you are on a different thread.