我试图显示从网站下载的图片,使用setIcon
和jLabel
jLabel5.setIcon(new ImageIcon("image.png"));
在程序开始时,图像不存在,下载后显示,没有问题。但如果它发生变化,即使它下载了较新版本的图像,它也会显示旧图像,就好像它有一个缓存或其他东西。
有人知道为什么会这样吗?如何使用或不使用此方法获得变通方法?
我还尝试过以下操作,看看它是否有帮助,但没有成功:
jLabel5.setIcon(null);
jLabel5.setIcon(new ImageIcon("image.png"));
它将不显示任何内容,然后再显示相同的旧图像。
答案 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();
}
});
}
}