在我正在开发的 JavaFX 应用程序中,我使用几个图标来设置一些按钮和 View 对象的样式。我使用的第一个图标已成功显示并打包到已部署的文件(.dmg、.app 和 .exe)中,因为我必须告诉 Ant 将资源文件夹包含在图标中。
当我使用 Eclipse 运行项目时,所有图标和图像都显示正确,但是当我部署项目时,只有其中两个(上次改进中包含的最后两个)未显示。既然我没有更改任何文件夹或配置,为什么会这样?
当我得到部署的.app时,我右键单击它并单击“显示包内容”,我可以看到不仅这两个图标没有打包在 /Contents/Java/Resources/
,但许多其他内容实际上神秘地显示在应用程序中。现在我解决了这个问题,将所有需要的图标复制到那里,但我无法使用 .exe 生成的文件来执行此操作,该文件不显示这两个正确的图标。
我的应用程序是一个名为 Musicott 的音乐管理器/播放器,is on github这样你就可以看到那里的所有代码。这两个图标是用于可视化和在轨道中移动的 slider 拇指;以及没有封面图像的轨道的默认封面图像。
在这张图片中您可以更好地看到问题 /image/8aVcz.png
- 我在
/com/musicott/view/RootLayoutController.java
第 503-506 行设置默认封面图像的代码 - 我在播放队列列表中设置默认封面图像的代码
/com/musicott/view/PlayQueueController.java
第 98-101 行 - 我在其中设置 slider 拇指图标的代码
/com/musicott/SceneManager.java
第 245-249 行
提前致谢。我会回答有关代码和项目的任何疑问。
最佳答案
看起来不错的项目!因此,正如 James_D 指出的那样,您当前正在使用以下代码加载图标:
new Image("file:resources/images/default-cover-icon.png")
new Image("file:resources/images/default-cover-icon.png", 45, 45, true, true));
问题在于,当您打包应用程序时,"file"协议(protocol)不再有效(请记住您正在向 Image 构造函数发送 URL)。您可以发送一个 InputStream(您可以从当前类中获取一个),请参阅以下示例代码:
new Image(RootLayoutController.class.getResourceAsStream("images/default-cover-icon.png"));
现在,如果您使用完全相同的代码,则需要确保(在构建 jar 之后)“images”文件夹最终位于“com/musicott/view/”文件夹内(因为 RootLayoutController 类是在该包内),因此您必须在当前的“资源”文件夹中添加两个额外的“com”和“musicott”文件夹,并将“images”文件夹移动到那里。您可能需要将其添加到您的 pom.xml 中。 xml 文件(以确保导出资源,因为我认为 maven 默认情况下只会导出位于“src/main/resources”的“resources”文件夹):
<resource>
<directory>resources</directory>
</resource>
注意,如果您想保留当前的文件夹结构(不在“resources”文件夹内创建“com/musicott/view”文件夹),您可以更改 getResourceAsStream() 中的路径调用“/images/default-cover-icon.png”(字符串开头的斜杠)以指示图像文件夹位于根目录。
继续努力!
关于java - 部署 JavaFX 应用程序的隐藏资源文件,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/31997295/