【问题标题】:Use of setIcon on jLabel repeats old image在 jLabel 上使用 setIcon 会重复旧图像
【发布时间】:2011-11-10 18:01:24
【问题描述】:

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

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

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

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

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

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

它什么都不会显示,然后又是相同的旧图像。

【问题讨论】:

    标签: java swing


    【解决方案1】:

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

    是的,缓存就是问题所在。这里有几个选项:

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

    【讨论】:

    • 不,不幸的是它没有帮助。我也尝试重新绘制组件,但我认为它没有任何用处,因为当我给 null 时,它会毫无问题地更改它。谢谢
    • @Filgera 那么你有另一个问题,
    【解决方案3】:

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

    【讨论】:

      【解决方案4】:

      例如

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

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2021-12-15
        • 1970-01-01
        • 2020-02-09
        • 1970-01-01
        相关资源
        最近更新 更多