在jLabel上使用setIcon会重复旧图像

我正在尝试使用setIconjLabel显示从网站下载的图像

 jLabel5.setIcon(new ImageIcon("image.png")); 

在程序开始时,图像不存在,下载,之后显示,没有问题。 但是如果它改变了,即使它下载了一个较新版本的图像,它也会显示旧图像,好像它有一个缓存或其他东西。

有人知道为什么会这样吗? 如何使用或不使用此方法获得解决方法?

我也尝试过以下操作来查看它是否有用,但没有成功:

 jLabel5.setIcon(null); jLabel5.setIcon(new ImageIcon("image.png")); 

它将不显示任何内容,然后再显示相同的旧图像。

它将显示旧的,好像它有一个缓存或其他东西。

是的,缓存是问题所在。 以下是几个选项:

 // This works using ImageIO imageLabel.setIcon( new ImageIcon(ImageIO.read( new File(imageName) ) ) ); // Or you can flush the image ImageIcon icon = new ImageIcon(imageName); icon.getImage().flush(); imageLabel.setIcon( icon ); 

您是否尝试使用SwingUtilities.invokeLater()方法,类似于:

 SwingUtilities.invokeLater(new Runnable() { public void run() { //JLabel myLabel = new JLabel("Old Text"); jLabel5.setIcon(new ImageIcon("image.png")); } }); 

从这里开始 。

如果问题与缓存有关,请尝试使用查询字符串下载图像。 例如, http : System.currentTimeMillis()该号码是从System.currentTimeMillis()获得的

例如

 import java.awt.*; import java.awt.image.BufferedImage; import java.util.Random; import javax.swing.*; public class LabelsIcon extends JFrame implements Runnable { private static final long serialVersionUID = 1L; private JLabel label = new JLabel(); private Random random = new Random(); private boolean runProcess = true; public LabelsIcon() { label.setLayout(new BorderLayout()); Dimension d = Toolkit.getDefaultToolkit().getScreenSize(); label.setPreferredSize(new Dimension(d.width / 3, d.height / 3)); add(label, BorderLayout.CENTER); setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); pack(); setVisible(true); new Thread(this).start(); } @Override public void run() { while (runProcess) { SwingUtilities.invokeLater(new Runnable() { @Override public void run() { label.setIcon(new ImageIcon(getImage())); } }); try { Thread.sleep(300); } catch (Exception e) { e.printStackTrace(); } } } public BufferedImage getImage() { int w = label.getWidth(); int h = label.getHeight(); GradientPaint gp = new GradientPaint(0f, 0f, new Color( 127 + random.nextInt(128), 127 + random.nextInt(128), 127 + random.nextInt(128)), w, w, new Color(random.nextInt(128), random.nextInt(128), random.nextInt(128))); BufferedImage bi = new BufferedImage(w, h, BufferedImage.TYPE_INT_RGB); Graphics2D g2d = bi.createGraphics(); g2d.setPaint(gp); g2d.fillRect(0, 0, w, h); g2d.setColor(Color.BLACK); return bi; } public static void main(String[] args) { SwingUtilities.invokeLater(new Runnable() { @Override public void run() { LabelsIcon t = new LabelsIcon(); } }); } }