【问题标题】:Updating ProgressBar through thread in javaFX通过javaFX中的线程更新ProgressBar
【发布时间】:2020-04-24 16:30:04
【问题描述】:

我正在开发一个使用 JavaFX 的 ProgressBar 的 Java 项目。根据我在 StackOverflow 上的发现,通常需要添加一个线程,或者程序需要实现 Runnable,以便动态更新 ProgressBar 的值,例如当程序在 for 循环中运行时。

但是,查看 java doc 和 stackoverflow 中的答案,我仍然不确定如何或什么是解决我的问题的最佳方法。

由于我对JavaFX一无所知,谁能给我一些提示?

下面是项目中给出的 Application.java

public class MyApplication extends Application {

    private static final String UI_FILE = "/ui.fxml";
    @Override
    public void start(Stage stage) throws Exception {
        FXMLLoader loader = new FXMLLoader();
        loader.setLocation(getClass().getResource(UI_FILE));
        VBox root = (VBox) loader.load();
        Scene scene =  new Scene(root);
        stage.setScene(scene);
        stage.setTitle("Team T-03: Course Scraper");
        stage.show();
    }
    public static void main(String args[]) {
        Application.launch(args);
    }
}

我应该实现相关循环和方法的Controller.java

public class Controller {
    @FXML
    private ProgressBar progressbar;

    @FXML
    void doSomething() {
        for (String object : objectList) {
            List<someObject> v = someOtherFunc(object);
            totalObjectCount += v.size();
            progress = (double) ++objectCount / v.size();
            progressbar.setProgress(progress);
        }
    }
}

【问题讨论】:

  • 由于我对 JavaFX 完全一无所知,那就继续学习吧,通常是通过教程..

标签: java javafx runnable


【解决方案1】:

使用Task, 并在新的Thread 中运行它。 Task 有自己的进度属性,updateProgress 方法确保对进度的更改在 FX 应用程序线程上执行。然后,您可以将进度条的进度绑定到任务的:

    @FXML
    void doSomething() {
        Task<Void> task = new Task<>() {
            @Override
            public Void call() {
                for (String object : objectList) {
                    List<someObject> v = someOtherFunc(object);
                    totalObjectCount += v.size();
                    updateProgress(++objectCount, objectList.size());
                }
                return null ;
            }
        }
        progressBar.progressProperty().bind(task.progressProperty());
        new Thread(task).start();
    }

【讨论】:

  • 谢谢詹姆斯!此代码有效!但是,当我启动 UI 时,我看到进度条从左向右滑动(就像它正在加载一样)是否正常?
  • @edwardlam0328 我想那是因为你对进度的计算是错误的。
  • 不,我的意思是当程序还没有调用 doSomething 方法时。该栏的行为类似于 Windows XP 中的启动屏幕。
  • @edwardlam0328 哦,是的;进度条最初处于“未确定”进度状态。如果您希望它开始为空,只需使用 progress=0 对其进行初始化。见docs
猜你喜欢
  • 1970-01-01
  • 2016-10-17
  • 1970-01-01
  • 2012-09-08
  • 1970-01-01
  • 2019-04-04
  • 2015-01-21
相关资源
最近更新 更多