我在使用 JavaFX 预加载器时遇到了问题。在启动阶段,应用程序必须连接到数据库并读取很多数据,所以我认为在此期间显示启动画面会很好。问题是 ProgressBar 自动变为 100%,我不明白为什么。
应用类。线程 sleep 稍后将被真正的代码取代(数据库连接等)
public void init() throws InterruptedException
{
notifyPreloader(new Preloader.ProgressNotification(0.0));
Thread.sleep(5000);
notifyPreloader(new Preloader.ProgressNotification(0.1));
Thread.sleep(5000);
notifyPreloader(new Preloader.ProgressNotification(0.2));
}
预加载器
public class PreloaderDemo extends Preloader {
ProgressBar bar;
Stage stage;
private Scene createPreloaderScene() {
bar = new ProgressBar();
bar.getProgress();
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 handleStateChangeNotification(StateChangeNotification scn) {
if (scn.getType() == StateChangeNotification.Type.BEFORE_START) {
stage.hide();
}
}
@Override
public void handleProgressNotification(ProgressNotification pn) {
bar.setProgress(pn.getProgress());
System.out.println("Progress " + bar.getProgress());
}
出于某种原因,我得到以下输出:
进度 0.0
进步 1.0
最佳答案
我遇到了同样的问题,经过两个小时的搜索和 5 分钟的仔细阅读 JavaDoc,我找到了解决方案。:)
通知由 notifyPreloader()
发送方法只能由 Preloader.handleApplicationNotification()
处理方法和您发送哪种类型的通知无关紧要。
所以改变你的代码是这样的:
public class PreloaderDemo extends Preloader {
.... everything like it was and add this ...
@Override
public void handleApplicationNotification(PreloaderNotification arg0) {
if (arg0 instanceof ProgressNotification) {
ProgressNotification pn= (ProgressNotification) arg0;
bar.setProgress(pn.getProgress());
System.out.println("Progress " + bar.getProgress());
}
}
}
关于JavaFX 预加载器未更新进度,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/20701704/