通过 Java Web Start 部署 JavaFX - 加载进度条

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

我的应用程序是由 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>

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

这是怎么回事?

最佳答案

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

通过使用官方 Oracle JavaFX 部署指南中的工具,您不需要手动编辑 jnlp 文件,因为这些工具应该生成一个文件供您高效加载应用程序。

遵循 Trouble Shooting Guide for Java Desktop Applications可以帮助您查明您的初创公司的性能问题所在。

JavaWS is downloading all the JARs in the background but there is no progress indication, which is very poor.

这很奇怪。您如何知道 JAR 下载需要时间? JavaFX 系统附带一个默认预加载器,该预加载器应该在应用程序 jar 下载时显示进度(它只是白色屏幕中央的蓝色进度条)。

"The JavaFX system ships with a default preloader" Yes I remember we had that for some time, I think it was before we added

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

更新

我刚刚注意到以下重新打开的错误 RT-25290 no default fx preloader for jnlp app 。正如我之前提到的,我实际上并没有遇到这个错误,并且默认的 JavaFX 预加载器在 OS X(Java 8 build 88)上为我显示,因此我不确定在什么情况下您可能会遇到这样的错误,但也许仍然需要注意。

关于通过 Java Web Start 部署 JavaFX - 加载进度条,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16443785/

相关文章:

java - 如何使警报对话框中的复选框左对齐?

java - 需要加速 GOval 对象的帮助(制作 Breakout 游戏)

C# 相当于 Java 标点正则表达式

加载后Javascript进度条清除值

ios - swift 中的循环进度

delphi - 在 Vista Aero 上禁用进度条动画

java - 对象数组内存分配(堆栈和堆)

spring - 如何自动部署 Spring Data Flow?

deployment - Liferay 部署备份并更改数据库

php - 部署 Symfony2 应用程序的首选方式是什么?