0

我正在阅读一本关于 Java 编程的书,如果我不明白它正在加载一个位图或者这里的代码,我就参与其中

Toolkit tk = Toolkit.getDefaultToolkit();
image = tk.getImage(getURL("castle.png"));

我想告诉它图像实际在哪里或什么的get URl是什么?

当我像这样运行它时,它如何找到我得到这个错误的图像 -

Uncaught error fetching image:
java.lang.NullPointerException

这是完整的代码 -

package randomshapes;

import java.awt.*;
import java.util.*;
import javax.swing.*;
import java.net.*;

public class RandomShapes extends JFrame{

  private Image image;

  public static void main(String [] args){
    new RandomShapes();
  }

  public RandomShapes(){
    super("DrawImage");
    setSize(600,600);
    setVisible(true);
    setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
    Toolkit tk = Toolkit.getDefaultToolkit();
    image = tk.getImage(getURL("castle.png"));
  }

  private URL getURL(String filename){
    URL url = null;
    try{
      url = this.getClass().getResource(filename);
    } catch (Exception e){ }
    return url;
  }

  public void paint(Graphics g){
    Graphics2D g2d = (Graphics2D) g;
    g2d.setColor(Color.WHITE);
    g2d.fillRect(0, 0, getSize().width, getSize().height);
    g2d.drawImage(image, 0, 40, this);
  }
}
4

2 回答 2

0

使用 Toolkit 加载图像时,假定图像位于相对于您的项目根类路径的位置。我个人使用并推荐使用ImageIO而不是 Toolkit 来加载图像。

例如,假设您具有以下结构:

com
 -> example
     -> game
     -> util
resources
 -> images
 -> fonts
    --> image.png

要使用 ImagoIO 将 image.png 作为 BufferedImage,您只需执行以下操作:

BufferedImage image = ImageIO.read(SomeClass.class.getResource("/resources/images.image.png");

该方法被声明为抛出 IOException,但我将把它的处理留给您。

于 2012-08-09T18:03:36.607 回答
0

我将非常具体地回答我的问题。在这种情况下,“图像加载失败”在这种情况下有点分散注意力。getURL()仔细看看方法:

private URL getURL(String filename){
  URL url = null;
  try{
    url = this.getClass().getResource(filename);
  } catch (Exception e){ }
  return url;
}

JDK 方法URL Class<T>.getResource(String)返回“如果没有找到具有此名称的资源,则返回 null”。简单地说:castle.png找不到文件。从这篇出色的博客文章中了解有关资源路径的更多信息。

在构造函数RandomShapes()中,此行失败并显示NullPointerException
image = tk.getImage(getURL("castle.png"));
方法Image Toolkit.getImage(URL)不接受null输入。

假设您的类位于 JAR 文件中,返回的 URL 将使用特殊的“jar:”方案,该方案由 Sun 专门设计用于提供 JAR 中文件的位置。

如果您的图像文件未存储在 JAR 中,您可以使用此技巧将文件路径转换为 ​​URL:URL myImageUrl = new File("/my/images/folder/castle.png").toURI().toURL()

不要想File.toURL()直接打电话;它被贬值以支持该toURI().toURL()技术。

于 2013-08-08T15:08:59.023 回答