私は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?...)
これどうやってするの?
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
を渡すことができると想定しています。getResourceAsStream
とClass
の両方にClassLoader
もあります。)
相対パスはプロジェクトフォルダであるため、相対パスを使用できます。
ImageIcon img = new ImageIcon("src/PackageB/PackageBa/PackageBaa/MyImage.png");
/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);
これは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