当前位置: 首页 > 知识库问答 >
问题:

JavaFX进度指示符更新不正确

罗智志
2023-03-14

我正在创建一个JavaFX桌面应用程序,我在上面模拟一些工作负载。我希望应用程序有一个动态更新的进度指示器(随着时间的推移),以显示加载过程是如何进行的。这是我的应用程序类:

public class App extends Application {

@Override
public void init() throws InterruptedException{
    //Simulation of time consuming code.
    for(int i = 0; i<=10; i++) {
        notifyPreloader(new Preloader.ProgressNotification(i/10));
        System.out.println("Progress is being set by the app to: " + (i/10));
        Thread.sleep(500);
    }
}

@Override
public void start(Stage primaryStage) {
    Parent root;
    try {
        root = FXMLLoader.load(getClass().getResource("/gui/fxml/App.fxml"));
        Scene scene = new Scene(root, 600, 400);

        scene.getStylesheets().add("/gui/style/app.css");

        primaryStage.setScene(scene);
        primaryStage.setTitle("Hello World!");
        primaryStage.show();
    } catch (IOException e) {
        e.printStackTrace();
    }
}
}

这是我的预加载程序类:

public class AppPreloader extends Preloader {
private Stage preloaderStage;
private Parent root;
private Scene scene;
private ProgressIndicator progress_indicator;

@Override
public void start(Stage primaryStage) throws Exception {
    this.preloaderStage = primaryStage;
    this.preloaderStage.setScene(this.scene);
    this.preloaderStage.show();
    this.progress_indicator = (ProgressIndicator) scene.lookup("#progressIndicator");
}


@Override
public void init() throws Exception {
    root = FXMLLoader.load(getClass().getResource("/gui/fxml/AppPreloader.fxml"));
    Platform.runLater(new Runnable() { 
        @Override
        public void run() {
            scene = new Scene(root, 600, 400);
            scene.getStylesheets().add("/gui/style/appPreloader.css");
        }
    });
}

@Override
public void handleProgressNotification(ProgressNotification pn) {
    if(pn instanceof ProgressNotification){
        progress_indicator.setProgress(pn.getProgress());
        System.out.println("Progress is being set by the handle method to: " + pn.getProgress());
    }
}

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

另外,我需要说的是,我已经检查了这两个问题(预加载程序中的progressbar不更新和javafx预加载程序不更新进度),但没有找到解决问题的方法

非常感谢您抽出时间。

共有1个答案

龙永逸
2023-03-14

首先,您没有看到预期的进度值,因为您使用的是整数算术:i10都是整数,所以i=10i/1001

其次,HandleProgressNotificationHandleStateChangeNotification方法是与加载资源相关的应用程序生命周期的一部分。这些实际上是JavaFX仍然支持web部署的时候遗留下来的,现在可能用途有限。

要从应用程序接收通知,您需要重写HandleApplicationNotification(...)方法。以下是这两个类的更正版本(也被修改为独立的,以便它们可以复制和运行:请在您的问题中提供这些类型的示例)

package application;

import javafx.application.Application;
import javafx.application.Preloader;
import javafx.scene.Parent;
import javafx.scene.Scene;
import javafx.scene.control.Label;
import javafx.scene.layout.StackPane;
import javafx.stage.Stage;

public class App extends Application {

    @Override
    public void init() throws InterruptedException{
        //Simulation of time consuming code.
        for(int i = 0; i<=10; i++) {
            notifyPreloader(new Preloader.ProgressNotification(i/10.0));
            System.out.println("Progress is being set by the app to: " + (i/10.0));
            Thread.sleep(500);
        }
        notifyPreloader(new Preloader.StateChangeNotification(Preloader.StateChangeNotification.Type.BEFORE_START));
    }

    @Override
    public void start(Stage primaryStage) {
        Parent root;
            root = new StackPane(new Label("Hello World"));
            Scene scene = new Scene(root, 600, 400);

            primaryStage.setScene(scene);
            primaryStage.setTitle("Hello World!");
            primaryStage.show();

    }

}
package application;

import javafx.application.Preloader;
import javafx.scene.Parent;
import javafx.scene.Scene;
import javafx.scene.control.ProgressIndicator;
import javafx.scene.layout.StackPane;
import javafx.stage.Stage;

public class AppPreloader extends Preloader {
    private Stage preloaderStage;
    private Parent root;
    private Scene scene;
    private ProgressIndicator progress_indicator;

    @Override
    public void start(Stage primaryStage) throws Exception {
        progress_indicator = new ProgressIndicator();
        root = new StackPane(progress_indicator);
        scene = new Scene(root, 600, 400);
        this.preloaderStage = primaryStage;
        this.preloaderStage.setScene(this.scene);
        this.preloaderStage.show();
    }


    @Override
    public void handleApplicationNotification(PreloaderNotification pn) {
        if (pn instanceof ProgressNotification) {
           //expect application to send us progress notifications 
           //with progress ranging from 0 to 1.0
           double v = ((ProgressNotification) pn).getProgress();
           progress_indicator.setProgress(v);            
        } else if (pn instanceof StateChangeNotification) {
            StateChangeNotification scn = (StateChangeNotification) pn ;
            if (scn.getType() == StateChangeNotification.Type.BEFORE_START) {
                preloaderStage.hide();
            }
        }
    } 
}
 类似资料:
  • 我试图在我的JavaFX接口类中实现一个进度指示器,它相应地更新到我的“读者”类,该类解析日志并跟踪它所取得的进展。 我目前的方法是创建一个单独的线程来运行Reader(这是因为当运行Reader时,界面会变得无响应),当Reader取得进展时,它将直接更新界面进度指示器。 接口类: 阅读类: } 当我在每次调用updateTransactionProgress()后检查进度栏时,该值正在正确更新

  • 主要内容:创建ProgressIndicator进度指示器()以动态更改饼图的形式显示JavaFX中的操作进度。以下代码显示如何使用不确定值创建。 上面的代码生成以下结果。 创建ProgressIndicator 以下代码通过传递值来创建。 可以使用空构造函数创建没有参数的进度指示器。然后可以使用方法分配值。 如果无法确定进度,可以在不确定模式下设置进度控制,直到确定任务的长度。 以下代码显示如何创建一个完成25%的。 上面的代码生成以下结果。

  • 问题内容: 我的应用程序中出现JavaFX(jdk 1.8.0_91)上的一个讨厌的错误,该错误中显示并更新了几个进度条(随机或同时显示)。有时,尤其是在填充进度条时(它具有进度条的样式类),但有时甚至一无所获,软件块和该跟踪出现了几次(并非总是相同的数字,而是最后一次)一次是27次): 然后在这27条痕迹之后跟随着大量的此消息: 线程“ JavaFX应用程序线程”中的异常java.lang.Ar

  • 我搜索了al堆栈溢出,我只找到了进度条。就像windows中的进度条和...我正在寻找一个多步骤进度条。就像我们在网上购物网站上存档信息时所拥有的一样。例如,它有4个步骤。1-选择产品2-填写信息...然后在每一步中,所有这些都是打开的,直到我们现在在那一步。下一步就走了。JavaFX中有thrick的插件吗?

  • 我有一个相当棘手的问题。 我所拥有的:

  • 我的kivy应用程序中有一个ProgressBar。我相信我需要使用,以确保从循环内部更新进度条。 以下代码是用于再现性目的的淡化版本。 ProgressBar类 主要类别: KV文件 此示例显示loading_pb.value按钮单击后代码循环时发生的变化。 进步吧。价值印刷输出 问题进度条的值似乎确实如预期的那样递增,但实际进度条直到循环结束时才立即改变。 相关的 无法更新kivy进度条 ki