使用 fxml 在 JavaFX 中显示图像

Jai*_*har 3 java javafx fxml

我一直未能成功尝试使用 fxml 在 JavaFX 应用程序中显示图像。\n我的代码:

\n
...\n<ImageView fitHeight="24" fitWidth="24"\n    pickOnBounds="true" preserveRatio="true">\n        <Image url="@res/icon.png"/>\n</ImageView>\n...\n
Run Code Online (Sandbox Code Playgroud)\n

我的项目目录结构:
\n在此输入图像描述

\n

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

\n

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

\n

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

\n
\n我已经尝试过:\n
    \n
  1. "/res/icon.png"-> 运行时错误 #1
  2. \n
  3. "res/icon.png"-> Lint 错误 + 运行时错误 #1
  4. \n
  5. "/../res/icon.png"-> Lint 错误 + 运行时错误 #1
  6. \n
  7. "../res/icon.png"-> Lint 错误 + 运行时错误 #1
  8. \n
  9. "@/res/icon.png"-> 运行时错误 #2
  10. \n
  11. "@res/icon.png"-> Lint 错误(我正在使用的)
  12. \n
  13. "@/../res/icon.png"-> Lint 错误 + 运行时错误 #2
  14. \n
  15. "@../res/icon.png"-> Lint 错误,无显示
  16. \n
\n

运行时错误#1:Caused by: java.lang.IllegalArgumentException: Invalid URL: Invalid URL or resource not found

\n

运行时错误#2:Caused by: javafx.fxml.LoadException: Invalid resource: /res/icon.png not found on the classpath

\n

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

\n
\n我见过:\n
    \n
  1. 为什么 JavaFX 中无法加载图像这正是我的配置。
  2. \n
  3. 如何使用ImageView显示图像我从那里获得了在 fxml 中链接图像的正确方法。没有错误,但图像未加载/显示。
  4. \n
  5. ImageView 不起作用,但我只想在 fxml 中执行此操作
  6. \n
  7. 无法加载 JavaFX 图像再次加载 JavaFX 图像 fxml。
  8. \n
  9. 无法在 JavaFX 中加载图像无法仅
  10. \n
  11. 将图像加载到 ImageView JavaFX仅 fxml。
  12. \n
  13. JavaFX 图像加载错误我没有使用 CSS。
  14. \n
  15. JavaFX 图像在后台和线程中加载不是我感兴趣的。
  16. \n
  17. 如何确定正确的路径...非常广泛,但是 fxml 呢?
  18. \n
\n
\n

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

\n

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

\n
    \n
  1. 正确的映像名称:名称有效,并且映像已正确部署到out文件夹。但IDE无法识别,导致错误或不显示。

    \n
  2. \n
  3. 正确的路径

    \n

    a)绝对 URL

    \n
  4. \n
\n

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

\n
 file:/C:/Users/Chander%20Shekhar/IdeaProjects/TestRes/out/production/TestRes/res/icon.png\n
Run Code Online (Sandbox Code Playgroud)\n

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

\n
/C:/Users/Chander%20Shekhar/IdeaProjects/TestRes/out/production/TestRes/res/icon.png\n
Run Code Online (Sandbox Code Playgroud)\n

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

\n
Caused by: java.lang.IllegalArgumentException: Invalid URL: unknown protocol: c\n
Run Code Online (Sandbox Code Playgroud)\n

\xc2\xa0\xc2\xa0\xc2\xa0\xc2\xa0\xc2\xa0\xc2\xa0b)相对 URL

\n

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

\n
file:/C:/Users/Chander%20Shekhar/IdeaProjects/TestRes/out/production/TestRes/res/icon.png\n
Run Code Online (Sandbox Code Playgroud)\n

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

\n
    \n
  1. 类路径:我还确保我有项目根目录的相对地址,src文件夹(我相信是类路径根目录)。错误?)
  2. \n
\n

但这一切最终还是无关紧要,因为我使用的是 fxml。上帝!

\n

All*_*uan 5

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

src/
|-- main/
    | -- java/
    | -- resources/
         | -- fxml/screen.fxml
         | -- img/image.png
Run Code Online (Sandbox Code Playgroud)

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

src/
|-- main/
    | -- java/
    | -- resources/
         | -- fxml/screen.fxml
         | -- img/image.png
Run Code Online (Sandbox Code Playgroud)

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

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