【问题标题】:Background with getResourceAsStream("path")背景与 getResourceAsStream("path")
【发布时间】:2011-07-01 00:07:18
【问题描述】:

我有这样的文件夹结构。

Project/src/folder/folder/folder/xyz.java
       /img/background.jpg

我想把 background.jpg 放到 xyz.java 的 JPanel 中。只是为了背景。 我已经做到了

    private ImageIcon createImageIcon(String path, String description) {
    java.net.URL imgURL = getClass().getResource(path);

    if (imgURL != null) {
        return new ImageIcon(imgURL, description);
    } else {
        System.err.println("Couldn't find file: " + path);
        return null;
    }
}

但这里的问题是图像必须与xyz.java 位于同一文件夹中 我搜索了一下,发现这可以用getResourceAsStream("path") 解决,但我无法提供足够的知识来解决这个问题。 这对我来说很重要,因为我想在不同的操作系统上以 *.jar 文件的形式运行我的程序。

我的问题是我不明白 getRessourceAsStream("path") 应该如何以不同的方式工作。我没有找到适合我的教程。似乎大多数人将它用于不同的 .jar 文件或 Applet。而且我不知道 Stream 可以做什么, getRessourceAsStream("path") 从哪里开始(意味着我必须如何编写路径)。知识太少了……

编辑:我找到了一个无需提供总路径的解决方案。 img = ImageIO.read(getClass().getResource("../../../../img/bg_1.jpg")); 我没有测试它,但它也应该在其他系统上运行。但问题是,我只能在 Eclipse 中启动我的程序。当我将它导出到 *.jar 文件中时,它发生得很好,但它不会加载图片。即使我设置了PreferredSize,它也会将窗口缩小到最小。 所以我也许应该解决 Stream 解决方案。但现在该睡觉了。

编辑:当我将图像放入包中时,相对路径可以正常工作。不是我真正想要的,但在猜测这个小问题 6 小时后,我不得不带一些鱼在我的海洋中游泳......

【问题讨论】:

  • 拥有 Java 编译器的好处就是 — 您在桌面上拥有自己的实验室,您可以尽情尝试。所以在那张纸条上,你尝试了什么,发生了什么?此外,如果您对获取背景图像感兴趣,为什么要处理 ImageIcons 而不仅仅是 BufferedImages?

标签: java swing background icons jlabel


【解决方案1】:

由于您还没有回复我的评论,我会提出一些问题并提出建议作为答案:

是否全部包含在一个 Jar 文件中?您是否尝试过在命令行上传递图像或图像目录的路径并将其作为命令行参数读入?再说一次,为什么在显示 Image 而不是 ImageIcon 时使用 ImageIcons?

编辑 1
关于你的 cmets:

我使用 ImageIcon 是因为 freenode.net 上的 ##java 告诉我它适合我的习惯。

我不知道##java 是谁,也不知道你适合什么“习惯”,但目前的情况是你使用的是 Image 而 ImageIcon 与此无关,所以真的,摆脱其中。简化并只使用您需要的东西。

我的第一个解决方案是这样的:img = ImageIO.read(new File("path"));但它还需要完整路径,而不是我从 html 中知道的一些 URL 路径。

ImageIO.read 的路径要求与您尝试执行的操作没有什么不同。它是您解决方案的一个很好的补充。

Jar 文件可以在不同操作系统上运行而无需任何额外内容。我只需要其中一个。

您还没有告诉我们您的图像是否在 jar 中,以及图像与您的类文件相关的位置,因为这是使用资源的关键——加载相对于位置的资源类文件。

【讨论】:

  • 我注意到现在使用ImageIcon 似乎是“in”的东西,即使它什么也没提供,而且是不正确地使用 API。布鲁格:)
  • 我使用 ImageIcon 是因为 freenode.net 上的 ##java 告诉我它适合我的习惯。我的第一个解决方案是这样的: img = ImageIO.read(new File("path"));但它还需要完整路径,而不是我从 html 中知道的一些 URL 路径。 Jar 文件可以在不同的操作系统上运行而无需任何额外内容。我只需要其中一个。
  • @froehli: "我的第一个解决方案是这样的:img = ImageIO.read(new File("path"));" 该方法被重载以接受InputStreamURL 也是如此。坚持ImageIO。使用getResource(String) 获取URL 并在继续之前检查它不是null
【解决方案2】:

Loading Images Using getResource

当您以实际大小显示图像时,在 JLabel 上使用 ImageIcon 非常棒。

如果您需要(动态)缩放图像或任何东西(类似),那么您需要对图像进行自定义绘画。

【讨论】:

  • 我已经用 getRessource 完成了,但这不允许我使用我想要的文件夹结构。
  • 好的。但目前对我来说是不必要的。我只想要文件夹结构。
  • @Andrew Thompson,我的意思是动态缩放的图像,随着框架大小的变化而调整大小,您需要进行自定义绘画。
猜你喜欢
  • 1970-01-01
  • 2022-07-21
  • 2011-01-19
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多