Обновление ProgressBar через поток в javaFX - PullRequest
0 голосов
/ 24 апреля 2020

Я работаю над проектом Java, в котором используется JavaFX ProgressBar. Из того, что я обнаружил в StackOverflow, обычно необходимо добавить поток, или программе необходимо реализовать Runnable, чтобы динамически обновлять значение ProgressBar, например, когда программа выполняется для l oop.

Однако, глядя на java do c и ответы в stackoverflow, я все еще не уверен, как или как лучше всего решить мою проблему.

Поскольку у меня нет абсолютно никаких знаний о JavaFX, кто-нибудь может дать мне подсказку?

Ниже приведено приложение. 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);
    }
}

Контроллер. 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);
        }
    }
}

1 Ответ

4 голосов
/ 24 апреля 2020

Используйте 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();
    }
...