JFrame f = new JFrame();
f.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
JLabel c = new JLabel(new ImageIcon("a.jpg"));
f.add(c);
f.pack();
f.setVisible(true);
try { Thread.sleep(2000); } catch (Exception e) {}
c.setIcon(new ImageIcon("b.jpg"));
f.pack();

単純にsetIconだけで切り替わる。
最後のpackは画像サイズに合わせるためだが、無くても表示は切り替わってくれる。
スレッドを使ってるらしいが、ちゃんとシングルスレッドルールに基づいてコードを書いてる?