2013-05-31 106 views
0

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

+1

旧的图像可以在缓存中保留,防止它被改变readding的标签。你如何阅读它?你应该使用'ImageIO.read(...)'。 –

+0

如果你可以添加一些你正在做的事情的代码片段会有帮助。 – Shaded

+0

我只是下载并覆盖filePath的图像,然后做JLabel myL = new ImageIcon(filePath); JDialog jd = new JDialog(); jd.add(MYL); jdialog显示旧图像。当我退出并重新启动程序时,显示新图像。 –

回答

4

但是它只是显示正确的jdialog。即使我已经调用了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); 
    } 
} 
+0

哦......我刚刚结束了从框架中删除组件,并将其作为一个新的jlabel lol读取它 –

+0

然后张贴在你自己作为自己的问题的答案,并选择它作为你的答案,或检查这一个作为一个满意的答案。 – JoshDM

+0

@ALee,'我刚刚从框架中删除了组件并将其作为新jlabel读取 - 为什么?我刚才向你展示了如何替换图标。 – camickr

-1

结束了从框架中删除旧的组件,并与新的图像

frame.remove(picLabel); 
BufferedImage b = ImageIO.read(new File(attemptedFilePath)); 
picLabel = new JLabel(new ImageIcon(b)); 
GridBagConstraints c = new GridBagConstraints(); 
c.weightx = 0.5; 
c.anchor = GridBagConstraints.FIRST_LINE_START; 
c.gridx = 0; 
c.gridy = 0; 
c.fill = GridBagConstraints.NONE; 
c.insets = new Insets(10,10,0,0); 
c.gridwidth = 15; 
c.gridheight = 15; 
frame.getContentPane().add(picLabel, c); 
+0

-1,修改组件的属性总是比较容易,然后重新创建组件并将组件添加回GUI。无论何时从可见的GUI添加/删除组件,还需要重新验证()/重新绘制父容器。您还需要知道正在使用的布局管理器,以便您可以设置约束条件。当你有多个组件时,这也不能很好地工作,因为你需要知道在哪里添加component.com组件。 – camickr