See this article for some performance tips. Essentially you want to keep to a bare minimum the work done in the UI thread as this impacts the rendering of components and makes it feel slow.
Swing applications have three types of threads:
- An initial thread
- A UI event dispatch thread (EDT)
- Worker threads
Every application must have a main method that represents its starting point. This method runs on an initial or startup thread. The initial thread might read program arguments and initiate a few other objects, but in many Swing applications, this thread's primary purpose is to start the application's graphical user interface (GUI). Once the GUI starts for most event-driven desktop applications, the initial thread's work is done.
Swing applications have a single EDT for the UI. This thread draws GUI components, updates them, and responds to user interactions by calling the application's event handlers. All event handlers run on the EDT, and you should programmatically interact with your UI components and their basic data models only on the EDT. Any tasks running on the EDT should finish quickly so that your UI is responsive to user input. Accessing your UI components or their event handlers from other threads will cause update and drawing errors in the UI. Performing long-running tasks on the EDT will cause your application to become unresponsive because GUI events will accumulate in the event dispatch queue.
Update based on the comment, here are a couple of other things to check:
Do you have a virus scanner running? On my work machine the virus scanner checks the contents of all jar files on load, this has a huge impact on startup times. If possible try turning the Virus scanner off or disabling it for that folder.
Are you loading extra classes on startup? Ideally you should have lightweight delegates loaded that only load the implementation when first invoked (this is common practice in sWT where each menu item is associated with a lightweight delegate that instantiates the type that does the actual processing when needed). You could try profiling the application to see what is being created on startup and add in some indirection accordingly.