【问题标题】:Java ImageIcon.GetImage hangingJava ImageIcon.GetImage 挂起
【发布时间】:2012-08-23 13:21:48
【问题描述】:

我在使用 ImageIcon().GetImage() 时遇到问题

奇怪的是,它有时可以工作并显示带有地图的窗口,而其他时候则不能。它也可以在其他计算机上完美运行,但在我的计算机上不行!

我已经尝试了一切,重新安装 Java,重新安装 IntelliJ,还禁用了我的防火墙,但无济于事。我还在 C# 中编写了一个类似的程序,它运行良好,这让我相信这不是权限错误。我还在带有板载显卡的基本 Windows XP 系统上对其进行了测试。

这是我的代码:

public class main {

public static void main(String[] args) {
    System.out.println("Running main..");
    try
    {
        URL url = new URL("http://maps.googleapis.com/maps/api/staticmap?center=-33.80382155278416,18.567184266922002&zoom=17&size=1024x1024&maptype=hybrid&sensor=false&format=png&key=AIzaSyCVnp9iTXRSS3ZE5FjzF7uNZavazWhLko4");
        Image img=new ImageIcon(url).getImage();
        System.out.println("INFO :"+img);
        new ImageFrame(img);

    }
    catch (Exception e)
    {
        e.printStackTrace();
    }
}

public static class ImageFrame extends JFrame{

    public ImageFrame(Image img){

        setPreferredSize(new Dimension(540, 480));
        setaImg(img);
        ImagePanel somePanel = new ImagePanel(540, 480);
        add(somePanel);
        setVisible(true);
    }

    private Image aImg;

    public Image getaImg() {
        return aImg;
    }

    public void setaImg(Image aImg) {
        this.aImg = aImg;
    }

    public class ImagePanel extends JPanel{

        public ImagePanel(int width, int height){
            setPreferredSize(new Dimension(width, height));
        }

        @Override
        public void paintComponent(Graphics g) {
            super.paintComponent(g);
            g.drawImage(getaImg(), 0, 0, null); // see javadoc for more info on the parameters
        }
    }



}

 }

我已经通过调试器运行了它,它停在这一行:

Image img=new ImageIcon(url).getImage();

但没有错误,它只是永远挂起。

我完全不明白为什么它不能在我的系统上运行,而只能在我的系统上运行。任何帮助将不胜感激。

【问题讨论】:

  • ImageIcon.GetImage -> NoSuchMEthodError DYM ImageIcon.getImage?如果是这样,请务必使用正确的大写字母,否则我们很可能会猜测正在使用 ImageIO 的扩展(且漏洞百出)实现。
  • 为什么不将ImageIcon 添加到JLabel 以显示它?
  • ImageFrame extends JFrame 不要扩展框架,只使用一个实例。

标签: java image swing awt


【解决方案1】:

适合我

Google 没有阻止您,是他们吗?根据记忆,您每天大约有 10,000 个查询。

尝试使用InputStream (URL.openStream()) 手动下载 URL,看看您是否收到除了图像二进制文件之外的某种响应。

更新

经过调查,发现是 Java 7 和 IPv6 的问题,此处记录在 Downloading files using Java randomly freezes

【讨论】:

  • 我也尝试过使用 InputStreamReader 但我得到了相同的结果。我也知道 Google 并没有阻止我,因为我在 C# 中运行了一个类似的程序,它运行良好。
  • 好的,听起来 Java 可能被防火墙阻止了,您使用的是 Windows 和 Windows 防火墙(或任何类型的防火墙)
  • 是的,使用 Windows 防火墙。在我的防火墙规则中,它声明 Java(TM) Platform SE Library 是允许的。
  • 好的,快速测试,禁用 Windows 防火墙,运行您的程序,重新启用 Windows 防火墙(仅在程序完成后或说 15-20 秒后):P
  • 好的禁用防火墙,仍然没有变化。
【解决方案2】:

始终在 EDT 上启动和更新 GUI。有关详细信息,请参阅Concurrency in Swing


g.drawImage(getaImg(), 0, 0, null); // see javadoc for more info on the parameters

该评论是非常好的建议,因为 4 字符编辑应该可以解决问题。

g.drawImage(getaImg(), 0, 0, this); // Observer is good for asynchronous image load

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2017-09-16
    • 2014-11-01
    • 1970-01-01
    • 1970-01-01
    • 2017-10-31
    • 2013-10-19
    • 2010-10-10
    • 1970-01-01
    相关资源
    最近更新 更多