JavaFX图像在舞台中无法显示

5

我尝试了几次,用了几种方法,但是我不能像我想要的那样在舞台上显示我的图像。我认为这可能与Java查找资源的路径有关,但我不确定,因为我刚开始使用可视化库(在这种情况下是JavaFX)。这是我的目录结构:

MyProject
 |_assets
 |  |_img
 |     |_myImage.jpg
 |
 |_some
 |_other
 |_folders
 |
 |_src
    |_ve
       |_org
          |_project
             |_MyProject.java
             |_StratPage.fxml
             |_StartPageController.java

我需要检索myImage.jpg并进行渲染,我尝试了以下方法:

1)纯fxml方法:

<ImageView
     id="logo" 
     fx:id="logo"
     fitHeight="99.0" 
     fitWidth="99.0" 
     layoutX="14.0" 
     layoutY="18.0" 
     pickOnBounds="true" 
     preserveRatio="true">
         <image>
            <Image url="@../../../../assets/img/myImage.jpg" />
         </image>
</ImageView>

2) 同时使用 fxml 和 java。通过声明 fx:id="logo"ImageView 元素,并像下面这样从 StartPageController.java 中注入图像:

public class StartPageController implements Initializable {

    @FXML
    private ImageView logo;


    @Override
    public void initialize(URL url, ResourceBundle rb) {
        this.logo = new ImageView("file:../../../../assets/img/myImage.jpg");
    }    

}

两种方式都没有产生任何异常,只是图片没有显示出来。我不知道该怎么办。非常感谢你的帮助。

更新:

第一次更新

我尝试放弃使用建议的目录结构,并将图像文件放置在StartPageController.java的同一文件夹中。通过这样做,

logo = new ImageView(new Image(getClass().getResourceAsStream("myImage.jpg")))

我没有收到任何异常,但是图片没有渲染,这表明它与找到资源无关,而是与呈现图像有关。可能是缺少任何库吗?我在使用Netbeans 8.0的Windows 8环境下。再次感谢您的回答。
第二个问题:
我刚刚在Netbeans项目属性中停用了打包和分发应用程序。现在图像正在正确地渲染,但我认为问题还没有解决,因为当我需要分发软件时它将再次出现。请仍然需要帮助!:)

你可以尝试使用 this.logo = new ImageView("/assets/img/myImage.jpg"); 吗?这将从您文件夹的根目录开始查找。 - Perneel
尝试使用this.logo = new ImageView("/assets/img/myImage.jpg");,但抛出了异常。在前面添加file:,像这样:this.logo = new ImageView("file:/assets/img/myImage.jpg");,并按照问题中提到的行为进行操作。它不会抛出任何异常,但正确加载应用程序,除了未显示图像。还有其他想法吗?感谢您的帮助 :) - Throoze
5个回答

5

我在自己的项目中检查了代码,它可以使用下面的片段。我已经根据你的示例进行了调整。

 this.logo = new ImageView(new Image(getClass().getResourceAsStream("/assets/img/myImage.jpg")));

我遇到了一个“NullPointerException: Input stream must not be null”的问题。我也尝试使用"file:/assets/img/myImage.jpg",但是同样出现了异常。getResourceAsStream()方法会在哪里查找文件? - Throoze
你确定你模拟了我拥有的相同目录结构吗? - Throoze
尝试将你的assets文件夹放在src文件夹下面,这样行不行?(为了确保,请进行清理和构建操作) - Perneel

4
我有和您一样的错误。为了纠正它,我将我的图像放置在与我的项目“src”同级别的资源文件夹中。这是我的代码,并且它可以工作。
public void showImage() {
    try {
        Image image = new Image("resources/img/akonolingaMap.jpg");
        imageView.setImage(image);
        imageView.setCache(true);
    } catch (Exception e) {
        printStackTrace();
    }
}

4
如果你使用Intellij作为你的主要编辑器,那么你可以将你的文件夹标记为“Resources”,或者打开“Project Structure” ->“Modules”,然后将你的图像文件夹标记为“Resources”。
希望这能帮到你。

最简单的答案。 - ADSquared

2

在Java应用程序中,文件系统File资源(在类路径上,.jar内部)之间有一个区别。

如果图像是应用程序的一部分,并且是固定的、只读的,就像您的相对路径所示,那么请使用资源。

但是,这时图像必须在.jar文件内部。

也许:

/src/assets/img/myImage.jpg

或者将/assets设置为顶级资源目录。
然后/img/myImage.jpg(或在第一种情况下为/assets/img/myImage.jpg
在编程中,不使用文件,而是使用URL getClass().getResource("/img/myImage.jpg")getResourceAsStream

你好!感谢您的回复!我该如何将“/assets”设置为顶级源目录?您的答案与Perneel的类似,但对我不起作用。请查看Perneel答案中的评论。 - Throoze
在Eclipse中:重命名资产,右键单击项目:新建/源文件夹:“assets”。然后移动img文件夹。顺便说一句,Maven构建基础设施在各种IDE中都非常出色,并提供最佳实践、文件夹约定。 - Joop Eggen
或者只需将资产添加到src下。 - Joop Eggen
1
我甚至放弃了使用建议的目录结构,将图像文件放置在StartPageController.java的同一文件夹中。通过执行this.logo = new ImageView(new Image(getClass().getResourceAsStream("myImage.jpg"))),我没有收到异常,但是图像没有渲染,这表明问题不在于找到资源,而在于渲染。这可能是缺少任何库吗?我正在使用Netbeans 8.0,在Windows 8环境下。再次感谢您的回复。 - Throoze
抱歉,Maven教程、文章等您需要自行搜索。另外,请使用7zip/WinZip检查生成的.jar文件中是否包含图像文件。 - Joop Eggen
显示剩余2条评论

0

这个问题可以通过将图标/图片所在的文件夹名称更改为“资源”来解决。它必须位于您当前的src文件夹中,这对我很有效(我曾经遇到过同样的问题)。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接