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

时间:2011-11-10 18:01:25

标签: java swing

我试图显示从网站下载的图片,使用setIconjLabel

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

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

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

我还尝试过以下操作,看看它是否有帮助,但没有成功:

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

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

4 个答案:

答案 0 :(得分:3)

  

它将显示旧的,好像它有一个缓存或什么。

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

//  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 );

答案 1 :(得分:2)

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

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

取自here

答案 2 :(得分:2)

如果问题与缓存有关,请尝试使用查询字符串下载图像。例如,http://abc.co.th/image.png?t=149534274该号码来自System.currentTimeMillis()

答案 3 :(得分:2)

例如

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();
            }
        });
    }
}