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

私は私の答えで非常に具体的にするつもりです。この場合、「画像の読み込みの失敗」はやや気を散らすものです。メソッドを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 に答える
0

Toolkit を使用してイメージをロードする場合、イメージはプロジェクトのルート クラスパスに相対的に配置されていると見なされます。個人的には、Toolkit の代わりにImageIOを使用してイメージをロードすることをお勧めします。

たとえば、次の構造があるとします。

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 に答える