No, ripeto che repaint() non ti serve. setIcon "sa" già chiedere il repaint. In generale ai componenti Swing non serve chiedere esplicitamente repaint. Hanno tutta la logica per sapere se/come/dove/quando fare un repaint della loro superficie.
Piuttosto dovresti preoccuparti di una cosa più rilevante: quando ImageIcon carica da url, utilizza dietro le quinte la API del Toolkit, in modo specifico il suo getImage(). Che però sfrutta un meccanismo di "caching", cioè a parità di url, ti restituisce sempre lo stesso oggetto Image. Quindi attenzione a quanti url presumi vengano gestiti!
JLabel non ha layout-manager (=posizionamento assoluto). Devi quindi dare i bounds ai componenti che hanno quel JLabel come parente strutturale.