【发布时间】:2017-06-06 11:55:26
【问题描述】:
我的 IDE 是 IntelliJ。我尝试使用this 文档来学习预加载器,但由于某种原因,我的主类永远不会调用预加载器,甚至不会调用它的方法。
这是我的主要课程:
public class LongInitApp extends Application {
Stage stage;
BooleanProperty ready = new SimpleBooleanProperty(false);
private void longStart() {
//simulate long init in background
Task task = new Task<Void>() {
@Override
protected Void call() throws Exception {
int max = 10;
for (int i = 1; i <= max; i++) {
Thread.sleep(200);
notifyPreloader(new ProgressNotification(((double) i)/max));
}
ready.setValue(Boolean.TRUE);
notifyPreloader(new StateChangeNotification(
StateChangeNotification.Type.BEFORE_START));
return null;
}};
new Thread(task).start();
}
public static void main(String args[]) {
launch(args);
}
@Override
public void start(final Stage stage) throws Exception {
longStart();
stage.setScene(new Scene(new Label("Application started"),400, 400));
ready.addListener(new ChangeListener<Boolean>(){
public void changed(
ObservableValue<? extends Boolean> ov, Boolean t, Boolean t1) {
if (Boolean.TRUE.equals(t1)) {
Platform.runLater(new Runnable() {
public void run() {
stage.show();
}});}}});;}}
还有我的预加载器类:
public class LongAppInitPreloader extends Preloader {
ProgressBar bar;
Stage stage;
boolean noLoadingProgress = true;
private Scene createPreloaderScene() {
bar = new ProgressBar(0);
BorderPane p = new BorderPane();
p.setCenter(bar);
return new Scene(p, 300, 150);
}
public void start(Stage stage) throws Exception {
this.stage = stage;
stage.setScene(createPreloaderScene());
stage.show();
}
@Override
public void handleProgressNotification(ProgressNotification pn) {
if (pn.getProgress() != 1.0 || !noLoadingProgress) {
bar.setProgress(pn.getProgress()/2);
if (pn.getProgress() > 0) {
noLoadingProgress = false;
}
}
}
@Override
public void handleStateChangeNotification(StateChangeNotification evt) {
//ignore, hide after application signals it is ready
}
@Override
public void handleApplicationNotification(PreloaderNotification pn) {
if (pn instanceof ProgressNotification) {
double v = ((ProgressNotification) pn).getProgress();
if (!noLoadingProgress) {
v = 0.5 + v/2;
}
bar.setProgress(v);
} else if (pn instanceof StateChangeNotification) {
stage.hide();
}
}
}
您也可以查看此http://docs.oracle.com/javafx/2/deployment/preloaders.htm 文档。此代码属于示例 9-11 和 9-12。
【问题讨论】:
-
你在哪里加载
Preloader?看看stackoverflow.com/questions/43551620/javafx-preloader-thread/… -
你是如何执行应用程序的?它需要与指定的预加载器一起打包(或使用非公共 API 类进行启动,如上面链接的问题中所示)。在这里简单地执行主类不会导致预加载器被加载。
-
我以为我会在使用 notifyPreloader 方法时启动它。我是否必须像“LauncherImpl.launchApplication(App.class,TestPreloader.class,args)一样启动它;” ?
-
所以我已将 LauncherImpl 方法添加到我的 LongInitApp 类中。它打开但立即关闭。我想将此预加载器用于我编写的 csv 阅读器程序,它在解析时应该被视为正在加载。我相信我不明白预加载器是如何工作的。提前感谢您的帮助
-
您预计如何部署此应用程序?你打算通过 web start 部署它吗?或者您只是要创建一个 jar 文件或自包含的应用程序包?如果您不打算使用 web start,我可能根本不会使用预加载器:只需在后台线程中启动一个任务,显示一个窗口,当任务完成时显示主窗口并隐藏原始窗口。我认为当真正的应用程序需要很长时间通过网络连接下载时,预加载器机制确实可以提供帮助:桌面应用程序不需要这种复杂性。
标签: java intellij-idea javafx javafx-2 javafx-8