web-dev-qa-db-ja.com

読み込みJava別のパッケージのクラスからパッケージ内の画像

私はJava MyProjectと呼ばれるプロジェクトを持っています。次のように、いくつかの異なるパッケージがあります(この質問の目的のために名前を単純に保ちます)。

src/PackageA
src/PackageA/PackageAa
src/PackageA/PackageAa/PackageAaa
src/PackageB
src/PackageB/PackageBa
src/PackageB/PackageBa/PackageBaa

クラスがあります

src/PackageA/PackageAa/PackageAaa/MyJavaFile.Java

そして私はイメージを持っています

src/PackageB/PackageBa/PackageBaa/MyImage.png

MyJavaFile.Javaの内部で、MyImage.pngの画像オブジェクトを宣言します

Image img = new Image(....what goes here?...)

これどうやってするの?

14
CodeGuy

Class.getResourceを呼び出して、/で始まるパスを指定するか、ClassLoader.getResourceを使用して/を気にしないでください。

URL resource = MyJavaFile.class
      .getResource("/PackageB/PackageBa/PackageBaa/MyImage.png");

または:

URL resource = MyJavaFile.class.getClassLoader()
      .getResource("PackageB/PackageBa/PackageBaa/MyImage.png");

基本的にClass.getResourceを使用すると、クラスに関連するリソースを指定できますが、thinkでは、ディレクトリナビゲーションに「..」などを使用できません。

もちろん、適切なパッケージ内のクラスを知っている場合は、次のように使用できます。

URL resource = SomeClassInPackageBaa.class.getResource("MyImage.png");

(問題のURLコンストラクターにImageを渡すことができると想定しています。getResourceAsStreamClassの両方にClassLoaderもあります。)

17
Jon Skeet

相対パスはプロジェクトフォルダであるため、相対パスを使用できます。

 ImageIcon img = new ImageIcon("src/PackageB/PackageBa/PackageBaa/MyImage.png");
4
/folderB/folderBa/folderBaa/MyImage.png

画像はプロジェクトフォルダの場所に保存できます。例:/images/MyImage.png

次に試してください:

Image img = new Image(/images/MyImage.png);

Jarファイルにあるプログラムを実行しているときはファイルパスを使用できません。特に、プログラムがアプレットまたはWebStartアプリケーションとしてロードされている場合は、ClassLoaderを使用して画像を取得できます。

画像をロードするには次のコードを使用します:

ClassLoader cldr = this.getClass().getClassLoader();

Java.net.URL imageURL = cldr.getResource("/PackageB/PackageBa/PackageBaa/MyImage.png");
ImageIcon aceOfDiamonds = new ImageIcon(imageURL);
2

これはIS JARアプリ内のすべての画像とアイコンを処理する最良の方法です。

すべての画像とアイコンを独自のJARファイルに圧縮したら、画像のJARファイルをライブラリタブに追加してビルドパスを構成し、クラスパスに含まれるようにします。

次に、コンストラクタの先頭で次のコードの3x行を使用して、シンプルなImageIconをメインアイコンとして受け入れないSystemTrayイメージを含むあらゆるものに必要なイメージにアクセスします(奇妙なことに)。 3x行は次のとおりです。

  URL iconUrl = this.getClass().getResource("/image-iconb.png");
  Toolkit tk = this.getToolkit();
  imageIcon = tk.getImage(iconUrl);

(imageIconは、Image変数として宣言された単なるコンストラクタです)これで、できるウィンドウアイコンを次のように設定します。

setIconImage(imageIcon );

andを宣言して、システムトレイアイコンを設定するときに、同じ変数を同時に使用します。

 trayIcon = new TrayIcon(imageIcon, "SystemTray Demo", popupMenu);

上記により、画像リソースを適切な場所に保持しないリスクを冒すことなく、ImagesまたはImageIconsを簡単かつ一元的に宣言できます。実行時に自動的にコンパイルされたすべての画像とプログラムの配布が含まれているJARにより、見栄えがよく、きちんと維持されます。

おまけとして、JARがクラスパスに登録されると、他のイメージを同じJARにいつでも追加でき、手間もかかりません-すべてが機能し、追加されたイメージはすぐに利用できますあなたのアプリ。

私の見解でははるかに良い。

GetResourceメソッドを使用して、srcルート内のリソースを読み取ります。たとえば、次のコードはフォルダーsrc/imagesから画像を取得します。

// Get current classloader
ClassLoader cl = this.getClass().getClassLoader();
// Create icons
Icon saveIcon  = new ImageIcon(cl.getResource("images/save.gif"));
Icon cutIcon   = new ImageIcon(cl.getResource("images/cut.gif"));

この例では、アプリケーションのJARファイルに次のエントリが存在すると想定しています。

images/save.gif
images/cut.gif
0
Lazy Coder