【发布时间】:2015-06-21 15:09:15
【问题描述】:
我有一个使用预加载器的 JavaFX 应用程序。我想做的是将它打包为一个本地包(Mac 应用程序或包含 Java JDK 副本的 Windows exe 文件),以便计算机上没有正确 Java 版本的用户仍然可以运行应用程序。我已经按照 creating native bundles 和 adding preloaders 的 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();
}
【问题讨论】:
-
如果是netbeans javafx项目,只需在属性中激活原生打包即可。如果您需要更自定义的方式,请使用 bin 目录中的 javapackager Javapackager
-
我认为Netbeans添加预加载器时有问题。在 Properties
-
您必须提供解决方案的最小代码示例(预加载器/应用程序)。请发布您的预加载器和应用程序(可能只是摘录)。我的两分钱:不要将预加载器用于本机捆绑桌面应用程序。预加载器旨在为 JNLP 完美工作。请阅读Application Startup,而不是您可能只想要splash screen solution
-
当我双击 jar 时,预加载器仍然有效。也许我应该问如何使 jar 文件使用指定的 JRE 运行。我已经有了应用程序结构——只是启动器文件似乎搞砸了。
-
刚刚尝试了 Jewelsea 的解决方案。这是一个好主意,但它太慢了。预加载器的好处——它可以快速启动——被放在主启动方法中就失去了。
标签: java javafx native preloader