我有一个小型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
中选择了移动的图像,该图像现在正在显示,但是这不是机器人我在寻找 ...
答案 0 :(得分:2)
项目文件夹结构与运行时类路径的结构不同。假设资源正确包含在构建路径中,则运行时类路径中image和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()));
答案 1 :(得分:1)
按照惯例,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")