Java 框架显示相同的图片

Java 框架显示相同的图片,java,image,frame,Java,Image,Frame,我的java程序根据纬度和经度从google下载图像。图像保存到我的桌面。然后我调用一个新的框架来打开并查看图像。这里是错误。当我尝试下载一个图像并查看它时,效果很好,但当我尝试下载另一个图像(覆盖了上一个图像)时,帧会显示上一个图像而不是新图像 BufferedImage image = null; try { URL url = new URL("https://maps.googleap

我的java程序根据纬度和经度从google下载图像。图像保存到我的桌面。然后我调用一个新的框架来打开并查看图像。这里是错误。当我尝试下载一个图像并查看它时,效果很好,但当我尝试下载另一个图像(覆盖了上一个图像)时,帧会显示上一个图像而不是新图像

                BufferedImage image = null;
                try {
                    URL url = new URL("https://maps.googleapis.com/maps/api/staticmap?center="+x+","+y+"&zoom=14&size=650x600&maptype=hybrid&markers=color:blue%7Clabel:X%7C"+ll.get(1)+","+ll.get(2)+"&sensor=true");
                    image = ImageIO.read(url);
                    ImageIO.write(image, "png",new File("C:\\Users\\"+System.getProperty("user.name")+"\\Desktop\\locationpic.png"));
                    new classes.viewPic(); // calls pic viewer
                }catch(Exception e){print("Could not download image...",Default);}
图片查看器

public class viewPic extends JFrame {
    public static void main(String [] args) {
        new viewPic();
    }
    public viewPic() {
        this.setTitle("Picture Viewer");
        this.setDefaultCloseOperation(JFrame.DISPOSE_ON_CLOSE);
        JPanel panel1 = new JPanel();

        ImageIcon pic = new ImageIcon("C:\\Users\\"+System.getProperty("user.name")+"\\Desktop\\locationpic.png");
        panel1.add(new JLabel(pic));
        this.add(panel1);
        this.pack();
        this.setVisible(true);
    }
}
public viewPic(BufferedImage image) {
        this.setTitle("Picture Viewer");
        this.setDefaultCloseOperation(JFrame.DISPOSE_ON_CLOSE);
        JPanel panel1 = new JPanel();

        // ImageIcon pic = new ImageIcon("C:\\Users\\"+System.getProperty("user.name")+"\\Desktop\\locationpic.png");
        ImageIcon pic = new ImageIcon(image);
        panel1.add(new JLabel(pic));
        this.add(panel1);
        this.pack();
        this.setVisible(true);
    }
由于我打开了另一个帧,即“父”帧,因此将默认关闭操作设置为关闭时退出将关闭我的所有帧


我能做什么?

您需要强制从磁盘重新加载映像。这可以通过以下方式实现:

  • 使用
    ImageIO
    读取图像
  • 使用
    Image.flush()
    方法
  • 如下所示:

    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 JPanel implements ActionListener
    {
        JLabel timeLabel;
        JLabel imageLabel;
        ImageIcon icon = new ImageIcon("timeLabel.jpg");
    
        public ImageReload()
        {
            setLayout( new BorderLayout() );
    
            timeLabel = new JLabel( new Date().toString() );
            imageLabel = new JLabel( timeLabel.getText() );
    
            add(timeLabel, BorderLayout.NORTH);
            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 );
                    }
                }
            });
        }
    
        private static void createAndShowUI()
        {
            JFrame frame = new JFrame("SSCCE");
            frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
            frame.add( new ImageReload() );
            frame.setLocationByPlatform( true );
            frame.pack();
            frame.setVisible( true );
        }
    
        public static void main(String[] args)
        {
            EventQueue.invokeLater(new Runnable()
            {
                public void run()
                {
                    createAndShowUI();
                }
            });
        }
    }
    
    注:


    本例使用该类在时间变化时动态创建标签的图像。

    我按照建议做了,将图像直接传递到图像查看器,而不将其保存到驱动器。这是密码

                    BufferedImage image = null;
                    try {
                        URL url = new URL("https://maps.googleapis.com/maps/api/staticmap?center="+x+","+y+"&zoom=14&size=650x600&maptype=hybrid&markers=color:blue%7Clabel:X%7C"+x+","+y+"&sensor=true");
                        image = ImageIO.read(url);
                        //ImageIO.write(image, "png",new File("C:\\Users\\"+System.getProperty("user.name")+"\\Desktop\\locationpic.png"));
                        new classes.viewPic(image);
                    }catch(Exception e){print("Could not download image...",Default);}
    
    现在是图片查看器

    public class viewPic extends JFrame {
        public static void main(String [] args) {
            new viewPic();
        }
        public viewPic() {
            this.setTitle("Picture Viewer");
            this.setDefaultCloseOperation(JFrame.DISPOSE_ON_CLOSE);
            JPanel panel1 = new JPanel();
    
            ImageIcon pic = new ImageIcon("C:\\Users\\"+System.getProperty("user.name")+"\\Desktop\\locationpic.png");
            panel1.add(new JLabel(pic));
            this.add(panel1);
            this.pack();
            this.setVisible(true);
        }
    }
    
    public viewPic(BufferedImage image) {
            this.setTitle("Picture Viewer");
            this.setDefaultCloseOperation(JFrame.DISPOSE_ON_CLOSE);
            JPanel panel1 = new JPanel();
    
            // ImageIcon pic = new ImageIcon("C:\\Users\\"+System.getProperty("user.name")+"\\Desktop\\locationpic.png");
            ImageIcon pic = new ImageIcon(image);
            panel1.add(new JLabel(pic));
            this.add(panel1);
            this.pack();
            this.setVisible(true);
        }
    
    我注释掉了它将图像下载到我的桌面上的那一行,而是将图像直接传递到了框架中。我还删除了图片查看器代码中的“void main”,因为它不需要出于任何原因出现在那里


    再次感谢所有回复者:):)谢谢你

    你确认每次下载的图像都不一样了吗?根据您的代码,没有任何错误。尝试以下方法:在单个程序中下载并显示图像(有一个用于ImageIcon拍摄图像的构造器,为它提供您在第一个示例中创建的构造器)。这样你就会知道是否有缓存机制阻止刷新。我之前的评论不是很清楚:作为中间步骤,下载并显示图像而不写入磁盘。这将排除缓存问题。@schmop,我现在正在尝试,我会在一个secWell@schmop返回给你,它按计划工作!我想补充一点,这会更有效率。谢谢你的帮助,我现在就发布工作代码:)非常感谢你的回复@camickr:)