【问题标题】:Frame displays the same picture框架显示相同的图片
【发布时间】:2014-05-09 18:43:09
【问题描述】:

我的 java 程序根据纬度和经度从谷歌下载图像。图像保存到我的桌面。然后我调用一个新框架来打开并查看图像。这是错误。当我尝试下载一张图片并查看它时,它工作正常,但是当我尝试下载另一张图片覆盖之前的图片时,框架会显示之前的图片而不是新的图片。

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

由于我打开了另一个框架,一个“父”框架,将默认关闭操作设置为关闭时退出将关闭我的所有框架。

我能做什么?

【问题讨论】:

  • 你确认每次下载的图片都不一样吗?根据您的代码,没有任何问题。试试这个:下载并在一个程序中显示图像(有一个 ImageIcon 的构造函数获取图像,给它你在第一个示例中创建的那个)。这样你就会知道是否有一些缓存机制阻止刷新。
  • 我之前的评论不是很清楚:下载并显示图像而不写入磁盘作为中间步骤。它将排除缓存问题。
  • @schmop,我正在尝试,我会尽快回复你
  • 好吧@schmop,它按计划工作!我可以添加它更有效。感谢您的帮助,我现在将发布工作代码:)

标签: java image frame


【解决方案1】:

您需要强制从磁盘重新加载图像。这可以通过以下方式完成:

  1. 使用ImageIO读取图片。
  2. 使用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();
            }
        });
    }
}

注意:

本示例使用Screen Image 类随时间变化动态创建标签图像。

【讨论】:

  • 非常感谢您的回复@camickr :)
【解决方案2】:

我按照建议做了,我将图像直接传递给图像查看器,但没有将其保存到我的驱动器中。这是代码。

                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 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”,因为它不需要任何原因。

再次感谢所有回复的人:) :) :) 谢谢

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2022-11-21
    • 2015-05-31
    • 1970-01-01
    相关资源
    最近更新 更多