JavaFX FXML 2.2 - 使用位图部署应用程序

时间:2013-12-17 22:20:55

标签: deployment javafx javafx-2

我经常搜索并尝试了几种方法来做到这一点,但我很难过。我正在编写一个桌面应用程序(虽然我认为它也可以在浏览器中运行),它允许Android程序员一次编辑所有的dimens.xml文件。我创建了自己的图像,在ImageViews中用作按钮。我使用不同的方法来访问这些图像:

  1. FXML文件中引用了一些内容,例如<Image url="@Icons/ic_launcher.png" />。路径为“src/Icons/”。 FXML文件的路径为“src/application/xxx,fxml”。

  2. css文件中引用了一些内容,例如“-fx-image:url("QuestionMark.png");”。 css文件和png文件位于同一目录“src/MessageBox/

  3. 有些是在运行时动态更改的:

    ImageView mButtonIcon = new ImageView("/insert_item_above.png");
    
    The path of the image: src/
    The path of the class: src/ContextMenuButton/
    
  4. 以上仅适用于Netbeans 7.4。在Eclipse中运行应用程序时无效。

    如果我转到dist /目录并从3种方法中的任何一种方法运行它,我会看到我的图像。

    如果我将dist /文件夹移动到其他地方,我可以让它工作的唯一方法是将src /文件夹复制到同一目录并删除除png和css文件之外的所有内容。所以,我最终得到了:

    + F:/AndroidDimens
        + dist
            xxx.jar
        + src
            insert_item_above.png
            + Icons
                 ic_launcher.png
            + MessageBox
                 QuestionMark.png
    

    因此,jar文件修改了相对于src /文件夹的所有路径。我的目标是使路径相对于jar文件的位置。我试图将图像放在我不需要项目相关路径的地方。但它必须使jar中的路径类似于“../src/MessageBox/QuestionMark.png”(相对于项目的dist /文件夹)。

    有什么方法可以解决这个问题吗?理想情况下,我希望所有图像都在一个目录中。然后我可以压缩该目录,其他人可以解压缩并运行该应用程序。

    谢谢!

    修改

    感谢@jewelsea(在聊天中),我发现问题是由于安装了旧版本的JDK 7u13以及JavaFX 2.2所需的最新版本。删除旧版本并更新引用它的全局变量可以解决问题。默认项目设置无需更改。

1 个答案:

答案 0 :(得分:2)

包装建议

使用JavaFX packaging tools将应用程序jar文件中的所有应用程序的运行时类文件和资源(fxml,css,png等)打包。

使用JavaFX打包工具是NetBeans 7.4在JavaFX应用程序项目的构建过程中自动执行的操作。

Eclipse和其他构建环境不会自动使用JavaFX打包工具。我相信,如果您将Eclipse与推荐的e(fx)clipse extension toolset for JavaFX development一起使用,那么该工具集将通过其UI为您提供使用JavaFX打包工具打包应用程序的能力。

JavaFX有第三方包装替代品,例如JavaFX Maven PluginJavaFX Gradle Plugin,它们也会正确打包您的应用程序。

无论您选择哪种包装工具,都要通过从生成的jar中解压缩文件来检查打包过程,并检查所有资源文件(fxml,css,png,属性等)是否是您希望它们位于jar内部的位置目录结构。这个解压缩过程只是一个开发人员健全性检查,您无需要求最终用户执行此类提取。

您的最终用户可以将您的应用程序作为已安装的本机应用程序(JavaFX术语self-contained application)或单击执行jar文件(JavaFX术语standalone program)运行,并且您的所有应用程序资源都将自动运行可以从打包的应用程序中获得,无需用户进行额外的工作。

资源访问建议

我建议不要在代码中引用src路径(因为你的分发jar中没有src路径),css或fxml文件,而是引用相对于分发jar的根目录的那些路径或者您的JavaFX应用程序类。例如,要在JavaFX Application子类中加载场景样式表,请使用JavaFX deployment guide - 3.3.4 Loading Resources建议的表单:

scene.getStylesheets().
    add(this.getClass().getResource("my.css").toExternalForm());