【问题标题】:JavaFX deployment through Java Web Start - Loading Progress Bar通过 Java Web Start 部署 JavaFX - 加载进度条
【发布时间】:2013-05-02 20:48:31
【问题描述】:

我的应用程序是由 JavaWS 部署的,但在用户单击 JNLP 后,会出现很长一段时间的停顿,似乎什么也没发生,然后应用程序就会在屏幕上弹出。 JavaWS 正在后台下载所有 JAR,但没有进度指示,非常糟糕。所以我开始构建一个自定义的:

public class LoadingProgress implements DownloadServiceListener
{
    Stage       stage;
    TextArea    log = new TextArea();

    public LoadingProgress()
    {
        stage = new Stage(StageStyle.UNDECORATED);
        stage.setScene(new Scene(PaneBuilder.create().children(log).prefHeight(300).prefWidth(300).build()));
        stage.show();
    }

    @Override
    public void downloadFailed(URL url, String version)
    {
        log.appendText(String.format("failed url=%s version=%s\n", url, version));
    }

    @Override
    public void progress(URL url, String version, long readSoFar, long total, int overallPercent)
    {
        log.appendText(String.format("progress url=%s version=%s readSoFar=%d total=%d overallPercent=%d\n", url, version, readSoFar, total, overallPercent));
    }

    @Override
    public void upgradingArchive(URL url, String version, int patchPercent, int overallPercent)
    {
        log.appendText(String.format("validating url=%s version=%s patchPercent=%d overallPercent=%d\n", url, version, patchPercent, overallPercent));
    }

    @Override
    public void validating(URL url, String version, long entry, long total, int overallPercent)
    {
        log.appendText(String.format("validating url=%s version=%s entry=%d total=%d overallPercent=%d\n", url, version, entry, total, overallPercent));
    }

}

下面是我的 JNLP。您会注意到我尝试以三种不同的方式使用自定义加载器类没有一种可以单独使用或组合在一起

<?xml version="1.0" encoding="utf-8"?>
<jnlp spec="6.0+" codebase="${url}" xmlns:jfx="http://javafx.com" href="Companyapp.jnlp">

    <information>
        ... info ...
    </information>

    <update check="always" policy="prompt-update" />

    <security>
        <all-permissions />
    </security>

    <resources>
        <jfx:javafx-runtime version="2.2+" href="http://javadl.sun.com/webapps/download/GetFile/javafx-latest/windows-i586/javafx2.jnlp" />
    </resources>

    <resources>
        <j2se version="1.6+" href="http://java.sun.com/products/autodl/j2se" />

        ... jar assets ...
    </resources>

    <jfx:javafx-desc main-class="com.mediacitizens.companyapp.presentation.desktop.Main" name="Companyapp" progress-class="com.mediacitizens.companyapp.presentation.desktop.LoadingProgress" /> <!--  width="0" height="0" //-->
    <application-desc main-class="com.mediacitizens.companyapp.presentation.desktop.Main" progress-class="com.mediacitizens.companyapp.presentation.desktop.LoadingProgress" />
    <component-desc progress-class="com.mediacitizens.companyapp.presentation.desktop.LoadingProgress" />
</jnlp>

所以这些都没有任何区别。即使有完整的日志记录+跟踪,也没有任何有趣的内容打印到控制台。

发生了什么事?

【问题讨论】:

    标签: java deployment progress-bar javafx java-web-start


    【解决方案1】:

    我不能确切地告诉您您的设置出了什么问题,但您不需要实现自己的DownloadService 来处理这个问题。相反,我建议使用 Oracle 官方 Java deployment guide for Preloaders 之后的 JavaFX 预加载器。该指南提供了高效启动应用程序的性能提示,包括诸如将预加载器分离到它自己的 jar 文件中、不阻塞 JavaFX 应用程序线程、启用后台更新检查、标记一些 jar 延迟加载、禁用自动代理配置等内容。

    通过使用官方 Oracle JavaFX 部署指南中的工具,您无需手动编辑 jnlp 文件,因为这些工具会为您生成一个文件,以便您有效地加载应用程序。

    关注Trouble Shooting Guide for Java Desktop Applications 可能会帮助您查明您的初创公司存在性能问题。

    JavaWS正在后台下载所有JAR但没有进度提示,很差。

    这很奇怪。你怎么知道是 JAR 下载需要时间? JavaFX 系统附带一个默认的预加载器,它应该在应用 jar 下载时显示进度(它只是一个位于白屏中心的蓝色进度条)。

    “JavaFX 系统附带一个默认的预加载器”是的,我记得我们有一段时间了,我想是在我们添加之前

    downloaded the JavaFX 2.2.21 samples 用于 OS X。然后转到提取的示例目录并运行 javaws Ensemble.jnlp,当应用程序启动时标准预加载器显示为蓝色进度条。也许如果您使用与 Ensemble 示例应用类似的打包说明,那么事情会更适合您。

    更新

    我刚刚注意到以下重新打开的错误RT-25290 no default fx preloader for jnlp app。正如我之前提到的,我实际上并没有遇到这个错误,并且默认的 JavaFX Preloader 在 OS X(Java 8 build 88)上为我显示,所以我不确定在什么情况下你可能会遇到这样的错误,但也许不过还是要注意一些事情。

    【讨论】:

    • 谢谢 我会读一读这些。 > “你怎么知道是 JAR 下载需要时间?”我可以在 Wireshark 中看到它。 “JavaFX 系统附带一个默认的预加载器” 是的,我记得我们已经有一段时间了,我认为是在我们添加 &lt;jfx:javafx-desc ... 之前,这是使它在 OSX 上运行所必需的。不过,我无法回去让它出现。
    • 添加了对答案中的评论的回复。
    • 我遇到了类似的问题,默认 JavaFX 预加载器在 jar 的下载阶段未显示。我不确定它是否与同一个错误有关。在我的设置中,我在 Netbeans 8.1 中创建了一个 JavaFX Preloader 项目并将其添加到我的主项目(使用 Maven)中。问题链接:stackoverflow.com/questions/35849930/…
    猜你喜欢
    • 2016-07-11
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-03-06
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多