Java 不会显示被覆盖的图像

标签 java swing caching imageicon

我有一个从程序启动时的文件夹中读取的图像。该程序将从互联网下载新图像并覆盖旧图像,相同的文件路径和相同的名称,但显示的图像是旧图像。当我退出并重新加载程序时,会显示新图像。我知道图像没有改变,因为我还尝试从文件路径创建一个新的 ImageIcon 并在下载后将其显示在 JDialog 中,但它仍然是旧图像。有什么想法吗?

最佳答案

however it's only the jdialog that displays correctly. the original frame still shows the old image even though i've called frame.validate(); frame.repaint();

将图像读入内存不会导致组件引用新图像。您仍然需要将图标添加到使用旧图像的任何组件。

import java.awt.*;
import java.awt.event.*;
import java.awt.image.*;
import java.io.*;
import java.util.*;
import javax.imageio.*;
import javax.swing.*;
import java.net.*;

public class ImageReload extends JFrame implements ActionListener
{
    JLabel timeLabel;
    JLabel imageLabel;
    ImageIcon icon = new ImageIcon("timeLabel.jpg");

    public ImageReload()
    {
        timeLabel = new JLabel( new Date().toString() );
        imageLabel = new JLabel( timeLabel.getText() );
        getContentPane().add(timeLabel, BorderLayout.NORTH);
        getContentPane().add(imageLabel, BorderLayout.SOUTH);

        javax.swing.Timer timer = new javax.swing.Timer(1000, this);
        timer.start();
    }

    public void actionPerformed(ActionEvent e)
    {
        timeLabel.setText( new Date().toString() );

        SwingUtilities.invokeLater(new Runnable()
        {
            public void run()
            {
                try
                {
                    String imageName = "timeLabel.jpg";
                    BufferedImage image = ScreenImage.createImage(timeLabel);
                    ScreenImage.writeImage(image, imageName);

                    //  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 );
                }
                catch(Exception e)
                {
                    System.out.println( e );
                }
            }
        });
    }

    public static void main(String[] args)
    {
        ImageReload frame = new ImageReload();
        frame.setDefaultCloseOperation( EXIT_ON_CLOSE );
        frame.pack();
        frame.setVisible(true);
    }
}

关于Java 不会显示被覆盖的图像,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16866391/

相关文章:

java - 在 jtree 中编辑节点值时,我需要一个监听器来跟踪,但我应该怎么做呢?

java - 在单元格编辑器中调用操作后单元格不会更新

caching - Sitecore 8 : leverage browser caching

java - 查看答案-解码方式

java - 纬度和经度始终为零

java - 在不抛出异常的情况下实例化异常是否可以?

asp.net - Distributed Cache/Session 我应该转向哪里?

java - 从ServletInputStream获取wav文件

java - 我对 java 线程和 KeyEvents 有疑问吗?

html - 如何禁用 IE 中模式对话框的缓存?