16

我有一个名为 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,我想声明一个 Image 对象MyImage.png

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

我怎样才能做到这一点?

4

5 回答 5

21

您可以调用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");

(我假设您可以将 a 传递给有问题URLImage构造函数。还有getResourceAsStream和。)ClassClassLoader

于 2012-08-28T06:13:27.760 回答
4

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

 ImageIcon img = new ImageIcon("src/PackageB/PackageBa/PackageBaa/MyImage.png");
于 2015-10-01T23:24:29.850 回答
3
/folderB/folderBa/folderBaa/MyImage.png

图像可以存储到项目文件夹位置。例如:/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);
于 2012-08-28T06:12:34.913 回答
1

这是处理 JAR 应用程序中所有图像和图标的最佳方式。

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

然后只需在构造函数的开头使用以下3x 行代码来访问您需要的任何图像,包括不接受简单 I​​mageIcon 作为其主图标的 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);

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

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

在我看来好多了。

于 2014-12-30T22:57:21.507 回答
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
于 2013-09-09T10:07:31.843 回答