2011-10-30 9 views
2

私が作成したJListにアイコンを表示する際に問題が発生しています。関数getResource()にパスを渡して、URLオブジェクトにリソースを格納しています。しかし、getResource()関数を呼び出すたびに、ディレクトリにイメージが存在していてもnullが返されます。getResource()を使用してJListのアイコンを取得および表示する

私はstackoverflowと他のサイトで見てみましたが、私はこの問題の解決策を見つけることができません。私は自分のプロジェクトディレクトリ内の複数の場所に画像を保存しようとしても役に立たなかった。役立つなら、私はEclipse IDEを使用しています。だから、私は/ src /、/ src/resources /、およびプロジェクトフォルダにファイルを保存しました。ここで

は私のコードです:

import java.awt.*; 
import java.io.*; 
import java.net.URL; 
import java.util.ArrayList; 
import javax.swing.*; 

@SuppressWarnings("serial") 
public class JListRenderer extends DefaultListCellRenderer 
{ 
    private static ArrayList<CakeRecipe> cRecipes; 
    private ImageIcon[] images; 

    // Index of cake recipe 
private int cakeIndex; 

JListRenderer(ArrayList<CakeRecipe> recipes) 
{ 
    cRecipes = recipes; 
      // Initializes an array of ImageIcons FileHander.jpgCounter() counts the amount of JPG's in the folder, FileHandler.getPath() gives you the filepath 
    images = new ImageIcon[FileHandler.jpgCounter(new File(FileHandler.getPath()))]; 

    for(int i = 0, j = images.length; i < j; i++) 
     images[i] = createImageIcon("/resources/" + cRecipes.get(cakeIndex).getPhoto()); // cRecipes.get().getPhoto() gives you the filename of the village only (e.g.: photo.jpg) 
} 

protected static ImageIcon createImageIcon(String path) 
{ 
    URL imgURL = JListRenderer.class.getResource(path); 

    if(imgURL != null) 
     return new ImageIcon(imgURL); 
    else 
    { 
     System.err.println("Could not find image. Certain menu elements may not display properly"); 
     return null; 
    } 
} 

...

このコードの動作は、万一または私が正しくURLまたはのgetResource()を使用していないのですか?画像はディレクトリにあり、画像のパスと同じパスを渡しています。例:

"/resources/photo.jpg" 

ご協力いただければ幸いです。ありがとうございました。

編集:この問題はEclipseで発生しました。ビルドパスにリソースを登録しませんでした。シンプルな「リフレッシュ」で問題は解決しました。皆様のご協力ありがとうございます。

+1

「photo.JPG」ではなく「photo.jpg」であることは確かですか?正しいケースは、Jarsの 'getResource()'にとって不可欠です。 –

+0

ところで - 画像は瓶の中に入っていますか? –

+0

ファイルはphoto.jpgでしたが、Eclipseに問題がありました。助けてくれてありがとう。 – Drake

答えて

3

が、私は次のことを実行してみた、リソースのパッケージにあるtest.txtファイルを使用して:。。

package resourcestest; 

import java.io.File; 
import java.io.FileReader; 
import java.net.URL; 

public class Test { 

    public static void main(String[] args) throws Exception { 

     final URL test = Test.class.getResource("/"); 
     System.out.println(test); 

     final URL url = Test.class.getResource("/resources/test.txt"); 
     System.out.println(url); 

     if(url == null) { 
      System.out.println("URL is null"); 
     } else { 
      final File file = new File(url.toURI()); 
      final FileReader reader = new FileReader(file); 
      final char[] buff = new char[20]; 
      final int l = reader.read(buff); 
      System.out.println(new String(buff, 0, l)); 
      reader.close(); 
     } 

    } 

} 

最初の2 mainメソッドの文は、どのパスがruntの相対ルートとみなされているかを調べるために使用できますイム。

これをNetBeansとEclipseで試してみましたが、どちらの場合でもうまくいきました。さて、実際の質問は、あなたのプロジェクトのセットアップは何ですか、そしてどのようにビルドするのですか?ソースとクラスファイルのための別個のフォルダがありますか、それとも一緒に置かれていますか? AntスクリプトやEclipseビルドメソッドを使用していますか?

ファイルがパッケージ内でなくフォルダ内にある場合は、コンパイルパスまたはランタイムクラスパス上にあるとは限りません。私は後者がそうかもしれないと思う。 resourcesがフォルダではなくパッケージであることを確認してください。プロジェクトからjarファイルを作成し、その内容を確認してリソースが含まれているかどうかを確認してください。 jarファイルから実行して、違いがあるかどうか確認してください。

+0

あなたのソリューションはまさに正しいものでした。パスディレクトリにそれらを追加しても、Eclipseは変更をビルドパスに登録しませんでした。助けてくれてありがとう。 – Drake

3

関連するすべての要因を表示するのは難しいでしょうが、特定の状況で問題を特定するのは難しいかもしれません。 exampleを作業して独自の実装とそれを比較

それが動作するはずのように見えます
+1

この例をお寄せいただきありがとうございますが、Eclipseには問題がありました。写真はビルドディレクトリにありませんでした。 – Drake

関連する問題