将项目转换为Maven后,图像消失了

时间:2019-02-15 14:29:00

标签: java maven javafx fxml

我有一个小型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中可见,但运行后已从应用程序中消失。

这是文件夹结构:

enter image description here

有趣的是,programicon32.png正常工作,并显示在应用程序中。但是它是在FXML文件之外的另一个地方定义的:

@Override
public void start(Stage primaryStage) {
    ...
    this.primaryStage.getIcons().add(new Image("file:resources/images/programicon32.png"));
    initRootLayout();
    ...
}

编辑:

我已将图像移动到RootLayout.fxml所在的包中,并在SceneBuilder中选择了移动的图像,该图像现在正在显示,但是这不是机器人我在寻找 ...

2 个答案:

答案 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")