为具有预加载器的JavaFX应用程序创建本机包

皮质的

我有一个使用预加载器的JavaFX应用程序。我想做的是将其打包为一个本地捆绑包(包含Java JDK副本的Mac应用程序或Windows exe文件),这样,如果计算机上没有正确版本的Java的用户仍然可以运行应用程序。我已经按照Oracle的说明创建本地包添加预加载器我得到的正是您所期望的—运行我的程序的本机包。

问题在于捆绑包完全忽略了我的预加载器。它只是运行主程序(经过较长的加载时间)。我知道其中包含了预加载器,因为当我单独运行jar文件时,它就会显示出来。

有没有人成功地将JavaFX应用程序与预加载器捆绑在一起?你能指导我怎么做吗?我正在使用Netbeans。

编辑:

这是预加载器:

import javafx.application.Preloader;
import javafx.application.Preloader.ProgressNotification;
import javafx.application.Preloader.StateChangeNotification;
import javafx.scene.Scene;
import javafx.scene.control.ProgressIndicator;
import javafx.scene.image.ImageView;
import javafx.scene.layout.Pane;
import javafx.stage.Stage;
import javafx.stage.StageStyle;

public class Splash extends Preloader {

    ProgressIndicator bar;
    ImageView Background;
    Stage stage;

    private Scene createPreloaderScene() {
        bar = new ProgressIndicator();
        bar.setLayoutX(380);
        bar.setLayoutY(250);
        bar.setPrefSize(60, 60);

        Background = new ImageView("Images/Splash.png");
        Background.setEffect(null);

        Pane p = new Pane();
        p.setStyle("-fx-background-color: transparent;");
        p.getChildren().addAll(Background, bar);

        Scene scene = new Scene(p, 794, 587);      
        scene.setFill(null);
        scene.getStylesheets().add(Scrap2.class.getResource("CSS/Progress.css").toExternalForm());
        bar.setId("myprogress");
        return scene;
    }

    @Override
    public void start(Stage stage) throws Exception {
        this.stage = stage;
        stage.setScene(createPreloaderScene());    
        stage.initStyle(StageStyle.TRANSPARENT);
        stage.show();
    }

    @Override
    public void handleStateChangeNotification(StateChangeNotification scn) {
        if (scn.getType() == StateChangeNotification.Type.BEFORE_START) {
            stage.hide();
        }
    }

    @Override
    public void handleProgressNotification(ProgressNotification pn) {
        bar.setProgress(pn.getProgress());
    }    

    @Override
   public void handleApplicationNotification(PreloaderNotification arg0) {
          if (arg0 instanceof ProgressNotification) {
             ProgressNotification pn= (ProgressNotification) arg0;
             bar.setProgress(pn.getProgress());
          }
    }

}

这是我的主程序的第一部分:

@Override
public void init(){

    /*Root*/
    root = new Pane();
    root.setStyle("-fx-background-color: transparent;");
    root.setLayoutX(150);

    notifyPreloader(new Preloader.ProgressNotification(0.1));

    /*Create Background*/
    createBinding(stage);
    createContents();
    createSaveMessages();
    createFlipBook();

    notifyPreloader(new Preloader.ProgressNotification(0.2));

    /*Add Pages*/
    createOverview();
    createAccounts();
    notifyPreloader(new Preloader.ProgressNotification(0.3));
    createCounselors();
    createInsurance();
    notifyPreloader(new Preloader.ProgressNotification(0.4));
    createAssets();
    createPapers();
    notifyPreloader(new Preloader.ProgressNotification(0.5));
    createLoans();
    createFuneral();
    notifyPreloader(new Preloader.ProgressNotification(0.6));
    createWills();
    addAllPages();
    notifyPreloader(new Preloader.ProgressNotification(0.7));

    /*Add Toolbar on top*/
    createToolBar();
    notifyPreloader(new Preloader.ProgressNotification(0.9));

    /*Create Opening Instructions*/
    opening();

    /*Load Saved Data*/
    load();
    notifyPreloader(new Preloader.ProgressNotification(1.0));


}

@Override
public void start(Stage stage) {
    /*Scene*/
    scene = new Scene(root, 1200, 700);
    stage.setScene(scene);
    scene.setFill(null);

    /*Stage*/
    this.stage = stage;
    stage.initStyle(StageStyle.TRANSPARENT);
    stage.centerOnScreen();
    stage.show();
}
可怕的想法

此示例仅适用于安装程序exe / msi / image(没有Mac可以测试dmg)。此步骤逐步假定您已经安装了所需的工具,例如InnoSetup,Wix Toolset等。它还假定您已配置了可与Netbeans一起运行的工具(设置路径,编辑配置文件等)。

前提条件:

步骤1:

我在Netbeans中创建了一个新的JavaFX Application Project,如下所示:

步骤1

第2步:

然后,我给项目命名,并说向导也应该使用给定名称创建一个预加载器项目。另外,它应该在给定的包名称中创建一个应用程序类。

第2步

第三步:

之后,我右键单击该应用程序项目,然后在部署下选择“启用本机打包”。

第三步

第四步:

在第4步中,我为该应用程序创建了代码。预加载器将仅在init()方法中更新。您所有用于初始化应用程序的工作都应在此处进行。

JavaFXPreloaderApp.java

import javafx.application.Application;
import javafx.application.Preloader;
import javafx.event.ActionEvent;
import javafx.scene.Parent;
import javafx.scene.Scene;
import javafx.scene.control.Button;
import javafx.scene.layout.StackPane;
import javafx.stage.Stage;

public class JavaFXPreloaderApp extends Application {

  @Override
  public void start(Stage primaryStage) {
    Scene scene = new Scene(createContent(), 300, 250);
    primaryStage.setTitle("Hello World!");
    primaryStage.setScene(scene);
    primaryStage.show();
  }

  public Parent createContent() {
    Button btn = new Button();
    btn.setText("Say 'Hello World'");
    btn.setOnAction((ActionEvent event) -> {
      System.out.println("Hello World!");
    });

    StackPane root = new StackPane();
    root.getChildren().add(btn);
    return root;
  }

  @Override
  public void init() throws Exception {
    // A time consuming task simulation
    final int max = 10;
    for (int i = 1; i <= max; i++) {
      notifyPreloader(new Preloader.ProgressNotification(((double) i) / max));
      Thread.sleep(500);
    }
  }

  /**
   * @param args the command line arguments
   */
  public static void main(String[] args) {
    launch(args);
  }
}

步骤5:

The only missing part was the preloader code. Look for the only needed method handleApplicationNotification, all the other methods, like handleProgressNotification or handleStateChangeNotification, you can safely delete, or make them empty stubs.

JavaFXPreloader.java

import javafx.application.Preloader;
import javafx.application.Preloader.ProgressNotification;
import javafx.application.Preloader.StateChangeNotification;
import javafx.scene.Scene;
import javafx.scene.control.ProgressBar;
import javafx.scene.layout.BorderPane;
import javafx.stage.Stage;

/**
 * Simple Preloader Using the ProgressBar Control
 */
public class JavaFXPreloader extends Preloader {

  ProgressBar bar;
  Stage stage;

  private Scene createPreloaderScene() {
    bar = new ProgressBar();
    BorderPane p = new BorderPane();
    p.setCenter(bar);
    return new Scene(p, 300, 150);
  }

  @Override
  public void start(Stage stage) throws Exception {
    this.stage = stage;
    stage.setScene(createPreloaderScene());
    stage.show();
  }

  @Override
  public void handleApplicationNotification(PreloaderNotification info) {
    // Check if info is ProgressNotification
    if (info instanceof ProgressNotification) {
      // if yes, get the info and cast it
      ProgressNotification pn = (ProgressNotification) info;
      // update progress
      bar.setProgress(pn.getProgress());
      // if this was the last progress (progress reached 1), hide preloader
      // this is really important, if preloader isn't hide until app loader
      // reaches the start method of application and tries to open the stage of
      // the main app with the show() method, it will not work.
      if (pn.getProgress() == 1.0) {
        stage.hide();
      }
    }
  }
}

Step 6:

Now it was time to bundle the application to native packages (image only/exe/msi). I right clicked on the applicaton project and selected the packages to create one by one.

步骤6

Step 7:

After choosen to package as image only your directory should look like this:

步骤7

Step 8:

After digging deeper in your directory you should find the image:

步骤8

Step 9:

A double click on the .exe file should start your application:

步骤9

Remarks:

您可能会犯的最大错误是,在应用程序的start方法中调用事物。通常,所有这些操作都必须在应用程序init方法中完成,在那里您加载了巨大的文件,在那里您将连接到db,或者在那里您加载了具有大量css或fxml文件的巨大的自定义布局。还有可以和预加载器说再见的地方(进度= 1)。尝试不要在应用程序启动方法中的预加载器上执行任何操作。不要认为在Thread的情况下,预加载器可以在显示主阶段之前执行操作,因此请按顺序加载所有内容。

本文收集自互联网,转载请注明来源。

如有侵权,请联系[email protected] 删除。

编辑于
0

我来说两句

0条评论
登录后参与评论

相关文章

来自分类Dev

JavaFX:如何创建具有不同侦听器主体的应用程序实例

来自分类Dev

当应用程序加载时,根据数据具有“&”字符的 URL 预填充 Shiny 输入

来自分类Dev

我可以为JavaFX应用程序创建自己的本机启动器吗?

来自分类Dev

如何确定是否必须为RN> = 0.60的应用程序创建本机apk / JS捆绑包

来自分类Dev

Windows Mobile本机应用程序是否具有CSRF?

来自分类Dev

具有本机iOS功能的混合应用程序

来自分类Dev

iOS应用程序加载器显示包错误

来自分类Dev

如何在带有动画的 JavaFX 应用程序中为字符创建老虎机?

来自分类Dev

有没有办法为本机IOS应用程序创建可用的滚动条?

来自分类Dev

为Javafx应用程序创建捆绑罐

来自分类Dev

创建本机安装程序桌面应用程序时如何在包中包含Adobe Air

来自分类Dev

为WPF应用程序创建加载项

来自分类Dev

当闪亮的应用程序加载时预加载所有标签

来自分类Dev

无法创建反应本机应用程序

来自分类Dev

具有身份的Blazor应用程序无法创建帐户控制器

来自分类Dev

使用Maven3创建具有所有依赖项的单个骆驼应用程序包

来自分类Dev

铁路由器,尝试为每个联系人创建一个具有单独页面的联系人应用程序

来自分类Dev

AngularJS2-在应用程序启动之前预加载服务器配置

来自分类Dev

完全独立的Flash SWF应用程序是否需要预加载器?

来自分类Dev

渲染 React Redux 应用程序时,实现预加载器栏卡住

来自分类Dev

如何在现有应用程序中为Quickbooks连接器创建Web服务?

来自分类Dev

本机脚本:无法创建应用程序...无法加载模块:... app / main.js

来自分类Dev

如何创建某种启动屏幕/启动屏幕,在加载应用程序后消失?(反应本机)

来自分类Dev

如何在预加载Web应用程序时不显示所有按钮?

来自分类Dev

为跨平台应用程序创建许多本机GUI前端

来自分类Dev

SignTool错误->我无法为我的应用程序创建包,而只能为此应用程序创建

来自分类Dev

iOS为现有应用程序创建新项目

来自分类Dev

有没有办法为2个具有不同程序包名称的应用程序提供1个Firebase数据库?

来自分类Dev

在ExtJs 5应用程序中预加载ExtJs类

Related 相关文章

  1. 1

    JavaFX:如何创建具有不同侦听器主体的应用程序实例

  2. 2

    当应用程序加载时,根据数据具有“&”字符的 URL 预填充 Shiny 输入

  3. 3

    我可以为JavaFX应用程序创建自己的本机启动器吗?

  4. 4

    如何确定是否必须为RN> = 0.60的应用程序创建本机apk / JS捆绑包

  5. 5

    Windows Mobile本机应用程序是否具有CSRF?

  6. 6

    具有本机iOS功能的混合应用程序

  7. 7

    iOS应用程序加载器显示包错误

  8. 8

    如何在带有动画的 JavaFX 应用程序中为字符创建老虎机?

  9. 9

    有没有办法为本机IOS应用程序创建可用的滚动条?

  10. 10

    为Javafx应用程序创建捆绑罐

  11. 11

    创建本机安装程序桌面应用程序时如何在包中包含Adobe Air

  12. 12

    为WPF应用程序创建加载项

  13. 13

    当闪亮的应用程序加载时预加载所有标签

  14. 14

    无法创建反应本机应用程序

  15. 15

    具有身份的Blazor应用程序无法创建帐户控制器

  16. 16

    使用Maven3创建具有所有依赖项的单个骆驼应用程序包

  17. 17

    铁路由器,尝试为每个联系人创建一个具有单独页面的联系人应用程序

  18. 18

    AngularJS2-在应用程序启动之前预加载服务器配置

  19. 19

    完全独立的Flash SWF应用程序是否需要预加载器?

  20. 20

    渲染 React Redux 应用程序时,实现预加载器栏卡住

  21. 21

    如何在现有应用程序中为Quickbooks连接器创建Web服务?

  22. 22

    本机脚本:无法创建应用程序...无法加载模块:... app / main.js

  23. 23

    如何创建某种启动屏幕/启动屏幕,在加载应用程序后消失?(反应本机)

  24. 24

    如何在预加载Web应用程序时不显示所有按钮?

  25. 25

    为跨平台应用程序创建许多本机GUI前端

  26. 26

    SignTool错误->我无法为我的应用程序创建包,而只能为此应用程序创建

  27. 27

    iOS为现有应用程序创建新项目

  28. 28

    有没有办法为2个具有不同程序包名称的应用程序提供1个Firebase数据库?

  29. 29

    在ExtJs 5应用程序中预加载ExtJs类

热门标签

归档