 <p>What's happening is that the "event dispatch thread", where all the Swing events happen, is having to wait for your code. Don't do long-running stuff on the event dispatch thread. This is a famous anti-pattern. </p> <p>You should read the lesson from the Java tutorials, that starts at <a href="http://docs.oracle.com/javase/tutorial/uiswing/concurrency/index.html" rel="nofollow">http://docs.oracle.com/javase/tutorial/uiswing/concurrency/index.html</a>, which describes this. </p> <p>Two small points that are unrelated to your problem:</p> <ol> <li>Your code will be much more manageable if you use an array of <code>ImageIcon</code> variables, instead of six separate variables. </li> <li>You could use the <code>sleep</code> method of the <code>Thread</code> class instead of the "busy sleep" that you're using.</li> </ol>