JavaFX:加载数据任务以与进度条结合

时间:2017-05-02 09:03:34

标签: java multithreading javafx progress-bar javafx-8

对于我的JavaFX应用程序,我想实现一个加载任务,将它与进度条结合起来。

我有一个演示模型,如下所示:

public class PresentationModel {

    private final ObservableList<Country> countries = FXCollections.observableArrayList();
    // Wrap the ObservableList in a FilteredList (initially display all data)
    private final FilteredList<Country> filteredCountries = new FilteredList<>(countries, c -> true);
    // Wrap the FilteredList in a SortedList (because FilteredList is unmodifiable)
    private final SortedList<Country> sortedCountries = new SortedList<>(filteredCountries);

    private Task<ObservableList<Country>> task = new LoadTask();

    public PresentationModel() {
        new Thread(task).start();
    }
}

加载数据的任务:

public class LoadTask extends Task<ObservableList<Country>> {

    @Override
    protected ObservableList<Country> call() throws Exception {
        for (int i = 0; i < 1000; i++) {
            updateProgress(i, 1000);
            Thread.sleep(5);
        }

        ObservableList<Country> countries = FXCollections.observableArrayList();
        countries.addAll(readFromFile());

        return countries;
    }
}

这允许我将ProgressIndicator pi绑定到任务的progress属性:

pi.progressProperty().bind(model.getTask().progressProperty());

现在我需要从演示模型中的任务中加载数据,以便我可以将元素添加到表中:table = new TableView<>(model.getSortedCountries());

如何从加载任务访问演示模型中的数据?

1 个答案:

答案 0 :(得分:1)

当任务成功时,

Task会调用onSucceeded处理程序。 value属性具有call方法返回的实例。

task.setOnSucceeded(event -> {
    ObservableList<Country> countries = (ObservableList<Country>)event.getSource().getValue();
    // do something
});
Task方法中出现OnFailed时,

Exception也会调用call处理程序。你可以在这里处理例外。 (或者在call方法中捕获所有异常。)

task.setOnFailed(event -> {
    Throwable e = event.getSource().getException();
    if (e instanceof IOException) {
        // handle exception here
    }
});