Deployment JavaFX FXML 2.2-使用位图部署应用程序
我已经搜索了很多,并尝试了几种方法来做到这一点,但我被难倒了。我正在编写一个桌面应用程序(虽然我想它也可以在浏览器中运行),它允许Android程序员一次编辑所有的dimens.xml文件。我创建了自己的图像,在ImageView中用作按钮。我使用不同的方法访问这些图像:Deployment JavaFX FXML 2.2-使用位图部署应用程序,deployment,javafx,javafx-2,Deployment,Javafx,Javafx 2,我已经搜索了很多,并尝试了几种方法来做到这一点,但我被难倒了。我正在编写一个桌面应用程序(虽然我想它也可以在浏览器中运行),它允许Android程序员一次编辑所有的dimens.xml文件。我创建了自己的图像,在ImageView中用作按钮。我使用不同的方法访问这些图像: 有些在FXML文件中引用,如。路径是“src/Icons/”。FXML文件的路径是“src/application/xxx,FXML” css文件中引用了一些,如“-fx image:url(“QuestionMark.png
。路径是“src/Icons/
”。FXML文件的路径是“src/application/xxx,FXML
”-fx image:url(“QuestionMark.png”);
”。css文件和png文件位于同一目录“src/MessageBox/
”ImageView mButtonIcon = new ImageView("/insert_item_above.png");
The path of the image: src/
The path of the class: src/ContextMenuButton/
+ F:/AndroidDimens
+ dist
xxx.jar
+ src
insert_item_above.png
+ Icons
ic_launcher.png
+ MessageBox
QuestionMark.png
因此,jar文件修改了所有路径,使之与src/文件夹相对。我的目标是创建与jar文件所在位置相关的路径。我尝试将图像放置在不需要项目相关路径的位置。但它必须在jar中(相对于项目的dist/文件夹)创建类似“。/src/MessageBox/QuestionMark.png
”的路径
有办法解决这个问题吗?理想情况下,我希望所有图像都在一个目录中。然后我就可以压缩这个目录,其他人就可以解压缩并运行这个应用程序
谢谢
编辑
多亏了@jewelsea(在聊天中),我发现问题是由于安装了JDK 7u13的旧版本以及JavaFX2.2所需的最新版本。删除旧版本,并更新引用它的全局变量,解决了这个问题。无需更改默认项目设置。打包建议
使用将应用程序的所有运行时类文件和资源(fxml、css、png等)打包到应用程序jar文件中
NetBeans 7.4在JavaFX应用程序项目的构建过程中自动使用JavaFX打包工具
Eclipse和其他构建环境不会自动使用JavaFX打包工具。我相信,如果您使用推荐的Eclipse,那么该工具集将通过其UI为您提供使用JavaFX打包工具打包应用程序的能力
JavaFX有第三方打包替代方案,如或,也可以正确打包您的应用程序
无论您选择什么打包工具,都可以通过从结果jar中解压缩文件并检查所有资源文件(fxml、css、png、properties等)是否都在jar的内部目录结构中来测试打包过程。这个解压过程只是一个开发人员健全性检查,您不需要要求最终用户执行这样的解压
您的最终用户可以将您的应用程序作为已安装的本机应用程序(JavaFX术语)或点击执行jar文件(JavaFX术语)运行,并且您的应用程序的所有资源将自动从打包的应用程序中获得,而无需用户进行额外的工作
资源访问建议
我建议不要在代码中引用src路径(因为在分发jar中没有src路径)、css或fxml文件,而是引用那些相对于分发jar根目录或JavaFX应用程序类的路径。例如,要在JavaFX应用程序子类中加载场景样式表,请使用
谢谢我曾试图阅读有关部署JavaFX应用程序的Oracle文档,对我来说完全是希腊语。他们谈论你所做的事情,但从不展示你将如何/在哪里做。我查看了nbproject文件夹中的各种XML文件,看不出它是否在这些文件中,我必须输入一些内容。如果内置了打包工具,这不是很容易吗?谢谢。在你的问题中,你说它在NetBeans中工作,那么问题是什么呢?当我在NetBeans中运行项目时,它工作。问题是我必须做什么才能让它在IDE之外运行。另外,出于什么原因,我用来让它在Netbeans中运行的URL在Eclipse中不起作用。我更喜欢Eclipse,但Netbeans应该能够使部署更容易。因此,我提出了一个问题。我们可以在第二天讨论这个问题。
scene.getStylesheets().
add(this.getClass().getResource("my.css").toExternalForm());