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

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

当然,如果您知道正确包中的类,您可以使用:

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

(我假设您可以将URL传递给有问题的Image构造函数。在ClassClassLoader上也有getResourceAsStream 。)

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

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

/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); 

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

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

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

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

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

 setIconImage(imageIcon ); 

在设置System TrayIcon时同时使用相同的变量,声明:

  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