【问题标题】:JavaFX Image not showing in stageJavaFX 图像未在舞台上显示
【发布时间】:2014-08-07 05:48:25
【问题描述】:

我已经尝试了好几次和几种方法,但我无法让我的形象如我所愿地在舞台上展示。我认为这可能与 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")))

我没有遇到任何异常,但图像没有呈现,这表明我不是寻找资源,而是呈现图像。可能是缺少任何图书馆吗?我在 Windows 8 环境中,使用 Netbeans 8.0。再次感谢您的回答。

第二

我刚刚在 Netbeans 的项目属性中停用了打包和分发应用程序。现在图像可以正确渲染,但我认为问题没有解决,因为当我需要分发软件时,它会重新出现。请,仍然需要帮助! :)

【问题讨论】:

  • 你可以试试this.logo = new ImageView("/assets/img/myImage.jpg");吗?这应该从文件夹的根目录开始。
  • 试过this.logo = new ImageView("/assets/img/myImage.jpg");,并抛出异常。预先添加file:,如下所示:this.logo = new ImageView("file:/assets/img/myImage.jpg"); 并按照问题中提到的方式行事。它不会引发任何异常,但会正确加载应用程序,但未显示的图像除外。还有什么想法吗?感谢您的帮助:)

标签: java image javafx-2 javafx-8 fxml


【解决方案1】:

我检查了我自己项目中的代码,它可以与下面的 sn-p 一起使用。我已根据您的示例对其进行了调整

 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() 在哪里查找文件?
  • 你确定你模拟的目录结构和我一样吗?
  • 试着把你的assets文件夹放在你的src文件夹下,这样行吗? (清洁和构建只是为了确保)
【解决方案2】:

我和你有同样的错误。因此,为了更正它,将我的图像放在我项目的“src”同一级别的资源文件夹中。这是我的代码,它有效。

public void showImage() {
    try {
        Image image = new Image("resources/img/akonolingaMap.jpg");
        imageView.setImage(image);
        imageView.setCache(true);
    } catch (Exception e) {
        printStackTrace();
    }
}

【讨论】:

    【解决方案3】:

    如果您使用 Intellij 作为主编辑器,那么您可以将您的文件夹标记为“资源”或只打开“项目结构”->“模块”->然后将您的图像文件夹标记为“资源”

    希望对你有所帮助。

    【讨论】:

    • 最简单的答案。
    【解决方案4】:

    在 java 应用程序中,文件系统 File 和 resource (在类路径上,在 .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 答案中的 cmets。
    • 在eclipse中:重命名资产,右键项目:新建/源文件夹:“资产”。然后移动 img 文件夹。顺便说一句,maven 构建基础架构跨 IDE 非常棒,并提供最佳实践、文件夹约定。
    • 或者只是在src下添加资产。
    • 能否提供一个关于良好实践的 maven 文档的链接?
    • 我什至放弃了建议的目录结构,并将图像文件放在StartPageController.java的同一文件夹中。通过执行this.logo = new ImageView(new Image(getClass().getResourceAsStream("myImage.jpg"))),我没有遇到异常,但图像没有渲染,这表明我不是寻找资源,而是渲染。可能是缺少任何图书馆吗?我在 Windows 8 环境中,使用 Netbeans 8.0。再次感谢您的回复。
    【解决方案5】:

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2013-12-04
      • 1970-01-01
      • 1970-01-01
      • 2021-06-30
      • 2018-03-12
      • 1970-01-01
      • 2017-07-13
      • 2016-11-05
      相关资源
      最近更新 更多