java - 使用 fxml 在 JavaFX 中显示图像

标签 java javafx fxml

我一直在尝试使用 fxml 在我的 JavaFX 应用程序中显示我的图像,但没有成功。 我的代码:

...
<ImageView fitHeight="24" fitWidth="24"
    pickOnBounds="true" preserveRatio="true">
        <Image url="@res/icon.png"/>
</ImageView>
...

我的项目目录结构:
enter image description here

没有错误,但我的图像没有显示。我认为图像已加载,但未显示。
这可能吗?我该如何检查?如果是,难道不应该报错吗?

事实上,即使我给出了错误的名称,也不会出现运行时错误。所以可能没有加载?

我也尝试加载不同的图像并更改尺寸,但没有任何效果。


我试过了:
  1. "/res/icon.png" -> 运行时错误#1
  2. "res/icon.png" -> Lint 错误 + 运行时错误 #1
  3. "/../res/icon.png" -> Lint 错误 + 运行时错误 #1
  4. "../res/icon.png" -> Lint 错误 + 运行时错误 #1
  5. "@/res/icon.png" -> 运行时错误#2
  6. "@res/icon.png" -> Lint 错误(我正在使用的)
  7. "@/../res/icon.png" -> Lint 错误 + 运行时错误 #2
  8. "@../res/icon.png" -> Lint 错误,无显示

运行时错误 #1:原因:java.lang.IllegalArgumentException:无效 URL:无效 URL 或未找到资源

运行时错误 #2:引起:javafx.fxml.LoadException:无效资源:在类路径中找不到/res/icon.png

(我知道我们不应该在 url 中使用 .. 或 .。我只是在测试)


我见过:
  1. Why does Image don't load in JavaFX这正是我的配置。
  2. How to show image using ImageView从那里我得到了在 fxml 中链接图像的正确方法。没有错误,但图像未加载/显示。
  3. ImageView does not work但我想在 fxml 中执行此操作。
  4. Can't load JavaFX Image再次仅 fxml。
  5. Cannot load Image in JavaFX再次仅 fxml。
  6. Load Image to ImageView JavaFX再次仅 fxml。
  7. JavaFX Image loading error我没有使用 CSS。
  8. JavaFX image loading in background and threads不是我感兴趣的。
  9. How to determine correct path...非常广泛,但是 fxml 呢?

编辑:我重新创建了原始项目的副本,并尝试按照评论进行故障排除。

结果(对故障排除部分的响应):

  1. 正确的图像名称:名称有效,图像正确部署到 out 文件夹。但IDE不识别,导致报错或不显示。

  2. 正确的路径

    a) 绝对 URL

有趣的是,getClass().getResource("/res/icon.png").getExternalForm() 方法给出:

 file:/C:/Users/Chander%20Shekhar/IdeaProjects/TestRes/out/production/TestRes/res/icon.png

并且有效。不确定 file: 是否应该存在。 getPath() 方法给出:

/C:/Users/Chander%20Shekhar/IdeaProjects/TestRes/out/production/TestRes/res/icon.png

并且不起作用(运行时错误#1)。删除第一个 / 给出了另一个错误:

Caused by: java.lang.IllegalArgumentException: Invalid URL: unknown protocol: c

b) 相对 URL

所以我实际上在我的 res 文件夹中创建了一个标记类,并使用 ImageMarker.class.getResource("icon.png").toExternalForm() 给出了

file:/C:/Users/Chander%20Shekhar/IdeaProjects/TestRes/out/production/TestRes/res/icon.png

与第一个示例相同,并且有效!

  1. Classpath:我还确保我有项目根目录的相对地址,src 文件夹(我相信它是类路径根目录. Wrong ?)

但最终,所有这些仍然无关紧要,因为我使用的是 fxml。天呐!

最佳答案

我建议您使用资源文件夹,并将您的 FXML 和图像都放在该文件夹中。所以你会有这个文件结构:

src/
|-- main/
    | -- java/
    | -- resources/
         | -- fxml/screen.fxml
         | -- img/image.png

然后在 screen.fxml 上你会做类似的事情

<ImageView pickOnBounds="true" preserveRatio="true">
    <image>
        <Image url="@../img/image.png" />
    </image>
</ImageView>

这就是我组织项目的方式,而且效果很好。 CSS 文件也将存在于资源中,希望对您有所帮助。

PS:您有一个res/ 文件夹,但除非您确认,否则Java 不会将其识别为资源文件夹。如果您使用的是 IntelliJ,则可以右键单击它,然后选择“标记为资源根目录”。如果您使用 Maven,则可以通过多种方式将其声明为您的资源文件夹。无论如何,如果您只是将它重命名为 resources/,它将自动被视为您的资源文件夹。

关于java - 使用 fxml 在 JavaFX 中显示图像,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/63646114/

相关文章:

java - 创建按钮后将图像添加到 JavaFX 中的按钮

java - 如何在 Java FX 中将表单映射到 bean

multithreading - 如何避免不在 FX 应用程序线程上; currentThread = JavaFX 应用程序线程错误?

javafx - 使用单元工厂自定义 TreeCell

javafx - 使用 fxml 文件设置 anchorPane 的内容

java - 使用预定义 key 锁定的竞争条件解决方案

java - 克隆 dom.Document 对象

java - 您能帮我在结果集 rs=stmt.... 中找到以下错误吗?

java - GraphicsMagick + im4java,如何删除颜色配置文件(和其他冗余数据)

java - 与 Java JDBC 作斗争 :sqlite connection using Intellij