Javafx tableview在标签中显示整体下载速度

Javafx tableview在标签中显示整体下载速度,javafx,tableview,download,Javafx,Tableview,Download,我有一个TableView,它显示了任何下载的进度、速度等。现在我想用一个标签来显示整体下载速度,但我目前不知道如何解决这个问题。每次下载都是独立的 对于表格,请使用setCellValueFactory @FXML private TableView<Download> downloadTable; @FXML private TableColumn<Download, String> filenameColumn; @FXML private TableColumn&

我有一个TableView,它显示了任何下载的进度、速度等。现在我想用一个标签来显示整体下载速度,但我目前不知道如何解决这个问题。每次下载都是独立的

对于表格,请使用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());
}
@FXML
私有TableView下载表;
@FXML
私有TableColumn文件名Column;
@FXML
私人表格栏目;
@FXML
私人TableColumn下载SpeedColumn;
@FXML
私有void初始化(){
filenameColumn.setCellValueFactory(cellData->cellData.getValue().filenameProperty());
progressColumn.setCellValueFactory(cellData->cellData.getValue().progressProperty().asObject());
progressColumn.setCellFactory(ProgressBarTableCell.forTableColumn());
下载SpeedColumn.setCellValueFactory(cellData->cellData.getValue().transferSpeedProperty());
}
公共无效设置主(主){
setItems(main.getDownloads());
}
对于启动下载线程,我使用带有fixedThreadPool的Executorservice

我想在下载列表上迭代并添加每种速度,但我不知道该由谁触发更新


我愿意接受任何建议

如果使用返回包含
transferSpeedProperty
的数组的创建可观察下载列表,则每当任何元素的任何传输速度属性发生更改时,它都会触发更新通知

因此,请使用以下方法创建您的列表

ObservableList<Download> downloads 
    = FXCollections.observableArrayList(download -> new Observable[] {download.transferSpeedProperty()});


我已经按照你的建议做了,但是我得到了“线程中的异常”thread-x“java.lang.IllegalStateException:不在FX应用程序线程上;currentThread=thread-x”这意味着你正在从后台线程更新传输速度:如果你想改变UI,你不能这样做。这真的是一个不同的问题,但在这个论坛上。我读了很多,但我认为我是愚蠢的修复它。我要给我们一个定时器和platform.runlater,每隔几秒钟更新一次。无论如何谢谢你!
DoubleBinding overallProgress = Bindings.createDoubleBinding(() -> 
    downloads.stream().collect(Collectors.summingDouble(Download::getTransferSpeed)),
    downloads);
Label overallTransferSpeedLabel = new Label();
overallTransferSpeedLabel.textProperty().bind(overallProgress.asString());