Filgera
Filgera

Reputation: 343

Use of setIcon on jLabel repeats old image

I'm attempting to display an image that was downloaded from a website, with the use of setIcon and a jLabel

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

At the start of the program, the image doesn't exist, it gets downloaded, and after that displayed, with no problems. But if it changes, even if it downloads a newer version of the image, it will display the old one, as if it had a cache of it or something.

Does someone know why this happens? How to get a workaround with or without this method?

I have also tried to do the following to see if it could help, with no success:

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

It would display nothing and then the same old image again.

Upvotes: 3

Views: 5260

Answers (4)

camickr
camickr

Reputation: 324118

it will display the old one, as if it had a cache of it or something.

Yep, caching is the problem. Here are a couple of options:

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

Upvotes: 3

mKorbel
mKorbel

Reputation: 109813

for example

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

Upvotes: 2

wannik
wannik

Reputation: 12706

If the problem is about caching, try downloading the image with a query string. For example, http://abc.co.th/image.png?t=149534274 The number is obtained from System.currentTimeMillis()

Upvotes: 2

npinti
npinti

Reputation: 52185

Have you tried to use the SwingUtilities.invokeLater() method, similar to this:

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

Taken from here.

Upvotes: 2

Related Questions