10

我的 IDE 是 Eclipse,我的项目是一个独立的 JavaFX 应用程序(带有 OSGI 框架的纯 CS 架构)。

如何使用预加载器,因此预加载器将在我的主应用程序之前启动并稍后隐藏?

我在这里找到了一些代码:

http://docs.oracle.com/javafx/2/deployment/preloaders.htm#BABGGDJG

但我仍然不知道如何在 OSGI 框架中使用我的启动应用程序部署预加载器。

我在下面给出了我的启动应用程序的一些代码:

public class MyPrjMain extends Application {
    private static Stage primaryStage;

    public void start(final Stage stage) throws BusinessException {
        primaryStage = stage;
    
        init(primaryStage);
    
        primaryStage.show();
    }
}
4

2 回答 2

34

这是一个很长的答案,对于不耐烦的人来说,快速的答案是下载这个示例代码,用于显示一个启动任务的启动页面,看看它是否适合您的情况。


我的回答提供了有关 JavaFX 中Preloader样式功能的一般信息。您的问题特别提到Preloader了在 Eclipse 和 OSGI 环境中的使用,但我不会直接解决这种情况,因为我不使用这些技术。希望一般信息仍然适用于您的场景。

1. Java 原生支持在 Java 启动时显示启动页面。

  • 这可以使用-splash:<image> VM switch进行。

的优点和缺点:

+让您的独立应用程序显示启动图像的最简单方法。

+可以非常快速地显示 => 它是 VM 进程的参数输入,因此(可能)它甚至可以在 VM 本身完全初始化之前显示。

-功能有限 => 仅允许显示图像,而不是其他预加载器功能,例如报告初始化进度、动画、登录提示等(除非您使用 AWT API

-在 Java 8 之前无法在所有平台上工作(请参阅问题Mac:Impossible to use -splash: with JavaFX 2.2 and JDK 7)。

2. 预加载器可用于独立应用程序。

JavaFX Preloader 教程在部分中有一个示例9.3.4 Using a Preloader to Display the Application Initialization ProgressLongInitAppPreloader本教程在和类中提供了可执行的示例代码LongInitApp(使用我在此答案中提供的类名,因为本教程中的一个名称目前是错误的)。

示例独立应用程序具有较长的初始化时间,并且自定义Preloader提供了有关初始化进度的反馈。该示例通过调用来模拟长时间的初始化任务Thread.sleep,但真正的应用程序将执行诸如建立网络连接、检索和解析网络数据以及设置初始应用程序场景之类的操作。

预加载器并非特定于小程序和 WebStart,而是主要针对这些部署类型。applet 和 WebStart 初始化过程比独立应用程序初始化更复杂,因此 Preloader 文档的大部分内容都专门针对那些更复杂的场景。

3. 您不需要将 Preloader 放在单独的 JAR 中。

您可以将其放在与您的ApplicationPreloader相同的 JAR 中。对于通过网络加载协议(如WebStart )动态部署和更新的大型应用程序,将其放在单独的 JAR 中是有意义的。对于执行基于网络的初始化的独立应用程序,它可能没有太大区别,并且可以跳过单独的打包步骤以简化构建和部署过程。Preloader

4. 您可以在不使用 Preloader 的情况下实现 Preloader 风格的功能。

Preloader 的大部分(不是全部)功能都可以在不继承 Preloader的情况下实现。

你可以:

  1. 在应用程序的start方法中创建一个启动阶段。
  2. 在启动阶段放置一个启动图像和ProgressBar
  3. 为冗长的应用程序初始化过程提供后台任务。
  4. 从后台任务将初始化进度报告回您的启动阶段。
  5. 初始化完成后,可以:
    • 一种。用新创建的应用程序阶段替换启动阶段或
    • 湾。将启动阶段的场景内容替换为应用程序的新场景。

5b 可能是首选,这样您就不需要创建多个窗口。

有关此策略的示例,请参阅我对以下问题的回答:

在不使用 a 的情况下在 JavaFX 中显示进度监控启动画面的相关示例代码Preloader是:

上面的代码可以重构为使用 Preloader 子类,在这种情况下,有一个定义良好的框架来通知应用程序初始化事件,并且可以使用更灵活的部署模型(例如,单独的 jar 中的预加载器)。但是使用 aPreloader可能有点复杂。对于某些实现,可能不值得花时间了解Preloader框架。

5. WebStart 应用程序具有对 Splash Images 的 JNLP 支持

(这一点无关紧要,只是为了完整性而包括在内)。

I believe that webstart applications can have a flag in their jnlp file to show the startup image as the webstart application launches, but I've never been able to get that flag to work in a JavaFX 2 application, only in a Swing application and even then it wasn't all that reliable as it would only display the second time the application was launched.

于 2013-03-01T00:57:09.360 回答
1

恕我直言,预加载器仅在您作为 applet 或 webstart 运行时才有意义,因为预加载器可以打包为一个额外的 Jar,它首先下载并在后台下载应用程序的其余部分时执行。

所以我的建议是在你获得舞台的第一个时间点打开一个舞台,例如显示一个飞溅。

于 2013-02-28T08:11:04.840 回答