我有一个小型JavaFX应用程序。一切都很好,工作正常。突然,我想将这个项目转换为Maven项目(我想添加一些外部依赖项并在应用程序中使用它们)。
在Eclipse中,我右键单击了该项目,选择了Configure
,然后选择了Convert to Maven project...
。一切都很顺利,直到我构建并运行应用程序。整个应用程序运行良好,但在应用程序窗口中有一个徽标,并在将项目转换为Maven后 - 图像已消失。
我正在使用JavaFX与FXML和SceneBuilder。
在RootLayout.fxml
文件中,有一个条目:
<ImageView fitHeight="150.0" fitWidth="200.0" layoutX="225.0" layoutY="50.0" pickOnBounds="true" preserveRatio="true">
<image>
<Image url="@../../../../../../resources/images/nbtc.jpg" />
</image>
</ImageView>
在转换为Maven之后,它仍然可以在SceneBuilder
中看到,但是在运行它之后它已经从应用程序中消失了。
这是文件夹结构:
有趣的是,programicon32.png工作正常,它显示在应用程序中。但它在FXML文件之外的另一个地方定义:
@Override
public void start(Stage primaryStage) {
...
this.primaryStage.getIcons().add(new Image("file:resources/images/programicon32.png"));
initRootLayout();
...
}
编辑:
我已将图像移动到RootLayout.fxml
所在的同一个包中,并在SceneBuilder
中选择了移动的图像,图像现在显示,但仍然,这不是我正在寻找的机器人......
项目文件夹结构与运行时类路径的结构不同。假设资源正确地包含在构建路径中,那么运行时类路径中的图像和fxml的绝对路径是
/images/nbtc.jpg
和
/com/l4a/mbtc/application/util/RootLayout.fxml
因此需要将图像指定为
<Image url="@../../../../../images/nbtc.jpg" />
您也不应该依赖于在运行时作为文件可用的图像。通常,资源作为条目包含在.jar
文件中;这不允许通过file:
协议进行访问。使用getResource
代替:
this.primaryStage.getIcons().add(new Image(getClass().getResource("/images/programicon32.png").toExternalForm()));
按照惯例,maven使用特定的目录结构,最好也使用它。 (它是可配置的,但我从来不需要这样做,而对于那些对maven不熟悉的人来说,这会适得其反。)
src/
main/ // For the application code
java/
(com/lva/nbc/...')
resources/
(images/)
test/ // For unit tests
java/
resources/
这样,jar/war/ear
文件/类路径将包含我放在(...)
中的路径。
getClass().getResourceAsStream("/images/nbct.jpg")