Javafx tableview显示了Label中的整体下载速度

时间:2016-03-05 22:31:32

标签: javafx tableview downloading

我有一个TableView,可以显示任何下载的进度,速度等。现在我想在Label中显示整体下载速度,但我目前不知道如何解决这个问题。每次下载都是独立的。

对于表,使用setCellValueFactory

@FXML
private TableView<Download> downloadTable;
@FXML
private TableColumn<Download, String> filenameColumn;
@FXML
private TableColumn<Download, Double> progressColumn;
@FXML
private TableColumn<Download, String> downloadSpeedColumn;

@FXML
private void initialize(){
    filenameColumn.setCellValueFactory(cellData -> cellData.getValue().filenameProperty());

    progressColumn.setCellValueFactory(cellData -> cellData.getValue().progressProperty().asObject());
    progressColumn.setCellFactory(ProgressBarTableCell.<DownloadContainer>forTableColumn());

    downloadSpeedColumn.setCellValueFactory(cellData -> cellData.getValue().transferSpeedProperty());
}

public void setMain(Main main){
    downloadTable.setItems(main.getDownloads());
}

对于启动Downloadthreads,我使用带有fixedThreadPool的Executorservice。

我想迭代下载列表并添加每个速度,但我不知道触发更新的人是谁?!

我愿意接受任何建议!

1 个答案:

答案 0 :(得分:0)

如果使用https://nxsheet.com/sheets/56db6ae444a4018c075e5672创建可观察的下载列表,该列表返回包含transferSpeedProperty的数组,则只要任何元素的任何传输速度属性发生更改,它就会触发更新通知。

所以使用

之类的东西创建你的列表
ObservableList<Download> downloads 
    = FXCollections.observableArrayList(download -> new Observable[] {download.transferSpeedProperty()});

然后你可以做

DoubleBinding overallProgress = Bindings.createDoubleBinding(() -> 
    downloads.stream().collect(Collectors.summingDouble(Download::getTransferSpeed)),
    downloads);

Label overallTransferSpeedLabel = new Label();
overallTransferSpeedLabel.textProperty().bind(overallProgress.asString());