从不同包中的类加载包内的Java Image

时间:2012-08-28 06:06:28

标签: java image bufferedimage

我有一个名为MyProject的Java项目。我有几个不同的包(为了这个问题的目的保持名称简单),如下所示:

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?...)

我该怎么做?

5 个答案:

答案 0 :(得分:17)

您可以致电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将允许您指定相对于类的资源,但我不认为它允许您使用“..”等进行目录导航。

当然,如果你知道正确包装中的一个类,你可以使用:

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

(我假设您可以将URL传递给相关的Image构造函数。getResourceAsStreamClass上也有ClassLoader。)

答案 1 :(得分:4)

您可以使用相对路径,因为相对路径是项目文件夹。

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

答案 2 :(得分:2)

/folderB/folderBa/folderBaa/MyImage.png

图像可以存储到项目文件夹位置.eg:/images/MyImage.png

然后尝试:

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

运行jar文件中的程序时无法使用文件路径,尤其是当程序作为applet或WebStart应用程序加载时,您可以使用ClassLoader获取图像。

使用以下代码加载图片:

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

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

答案 3 :(得分:1)

这是处理JAR App中所有图像和图标的最佳方式。

将所有图片和图标压缩到自己的JAR文件后 - 通过将图像JAR文件添加到库选项卡中来配置构建路径,以便它现在包含在类路径中。

然后,只需在构造器的开头使用以下 3x代码行即可访问任何所需的图像,包括不接受简单ImageIcon的SystemTray图像。 s作为它的主要图标(我知道很奇怪)。 3x行是:

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

(imageIcon只是一个声明为Image变量的构造函数) 现在您可以将窗口图标设置为:

setIconImage(imageIcon );

同时通过声明设置系统TrayIcon时使用相同的变量:

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

以上功能可让您轻松集中地声明Images或ImageIcons,而不会冒不将图像资源保存在正确位置的风险。它使它保持整洁,JAR包含在运行时自动编译的所有图像以及程序的分发。

作为奖励,一旦JAR在您的类路径中注册 - 您可以随时在同一个JAR中添加任何其他图像而不用任何大惊小怪 - 一切正常,添加的图像是即时可用于您的应用。

在我看来好多了。

答案 4 :(得分:0)

使用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