重新加载的文件在java中不会更改

时间:2015-06-25 13:46:43

标签: java image swing jfilechooser

我尝试用文件选择器加载图像, 但是当我在加载后更新图像并重新加载图像时,图像不会改变。它只显示第一次加载。 (我试着不使用filechooser)

负荷 - >改变图像 - >加载 - >图像没有改变

负荷 - >更改图像 - >退出程序 - >打开程序 - >加载 - >图像变化

如何清除它?

加载图片

         int ret = chooser.showOpenDialog(null);    
         if(ret == JFileChooser.APPROVE_OPTION){
             String filePath = chooser.getSelectedFile().getPath();
             ImageIcon icon = new ImageIcon(filePath);
             main.ChangeImage(icon);
         }

更改图片

public void paintComponent(Graphics g) {
    Graphics2D g2 = (Graphics2D) g;
    g2.drawImage(image.getImage(), 0, 0, this);

}

public void ChangeImage(ImageIcon img) {
    image = img;
    origin_image = image;
    origin_height = image.getIconHeight();
    origin_width = image.getIconWidth();

    this.setBounds(0, 0, image.getImage().getWidth(null), image.getImage()
            .getHeight(null));
    repaint();
}

1 个答案:

答案 0 :(得分:2)

Java倾向于缓存图像。

如果图像在运行期间发生变化,一种欺骗方法重新加载的方法是自己读取文件的字节,从中形成输入流(使用ByteArrayInputStream)并使用输入流在ImageIO.read(InputStream)

这样做的原因是,如果使用URLFile来加载图像,则工具包会使用该位置作为密钥来缓存它。

其他说明

public void paintComponent(Graphics g) {
    Graphics2D g2 = (Graphics2D) g;
    // ..

应该是:

public void paintComponent(Graphics g) {
    super.paintComponent(g); // paint the border and BG to avoid arttifacts!
    Graphics2D g2 = (Graphics2D) g;
    // ..