工具套件图像加载器

时间:2012-08-09 17:47:03

标签: java

我正在阅读一本关于java编程的书。如果我不明白它正在加载一些图像或其他东西,那么这就是代码

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

什么是获取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);
  }
}

2 个答案:

答案 0 :(得分: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,但我将把它留给你。

答案 1 :(得分: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。详细了解this excellent blog post的资源路径。

在构造函数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()技术。