4

いくつかのダウンロードを行い、テーブル内の進行状況を表示しようとしています:

ここに画像の説明を入力

そのために、次のクラスを使用しています。

public class DownloadDataTable {


    private SimpleDoubleProperty progress;
    private SimpleStringProperty type;
    private SimpleStringProperty status;

    public DownloadDataTable(double progress, String type, String status) {
        this.progress = new SimpleDoubleProperty(progress);
        this.type = new SimpleStringProperty(type);
        this.status = new SimpleStringProperty(status);
    }

    public double getProgress() {
        return progress.get();
    }

    public void setProgress(double progress) {
        this.progress.set(progress);
    }

    public String getType() {
        String retorno;
        if (type==null){
            retorno="";
        }else{
            retorno=type.get();
        }
        return retorno;

    }

    public void setType (String type) {
        this.type.set(type);
    }

    public String getStatus(){
        String retorno;
        if (status==null){
            retorno="";
        } else{
            retorno=status.get();
        }
        return retorno;
    }

    public void setStatus(String status){
        this.status.set(status);
    }
}

TitledPane、tableview、および列テーブルを作成するには、次のようにしています。

public void addDownloadToTitledPane(DownloadContent downloadContent) {

        MetaDados metaDado = downloadContent.getMetaDado();

        String title = metaDado.getName();

        if (title.length() > 60) {

            title = title.substring(0, 57) + "...";
        }
        TableView downloadTable = new TableView();

        TableColumn<DownloadDataTable, Double> progress = new TableColumn<>("progress");
        progress.setCellFactory(new Callback<TableColumn<DownloadDataTable, Double>, TableCell<DownloadDataTable, Double>>() {
            @Override
            public TableCell<DownloadDataTable, Double> call(TableColumn<DownloadDataTable, Double> p) {

                final ProgressBar progressBar = new ProgressBar(-1);

                final TableCell cell = new TableCell<DownloadDataTable, Double>() {
                    @Override
                    protected void updateItem(Double t, boolean bln) {
                        super.updateItem(t, bln);
                        if (bln) {
                            setText(null);
                            setGraphic(null);
                        } else {
                            progressBar.setProgress(t);
                            progressBar.prefWidthProperty().bind(this.widthProperty());
                            setGraphic(progressBar);
                            setContentDisplay(ContentDisplay.GRAPHIC_ONLY);
                        }
                    }
                };


                cell.setAlignment(Pos.CENTER);
                return cell;
            }
        });
        progress.setCellValueFactory(new PropertyValueFactory<DownloadDataTable, Double>("progress"));
        progress.setText("Progresso");

        TableColumn<DownloadDataTable, String> type = new TableColumn<>("type");
        type.setCellFactory(new Callback<TableColumn<DownloadDataTable, String>, TableCell<DownloadDataTable, String>>() {
            @Override
            public TableCell<DownloadDataTable, String> call(TableColumn<DownloadDataTable, String> p) {
                TableCell cell = new TableCell<DownloadDataTable, String>() {
                    @Override
                    public void updateItem(String item, boolean empty) {
                        super.updateItem(item, empty);
                        setText(empty ? null : getString());
                        setGraphic(null);
                    }

                    private String getString() {
                        return getItem() == null ? "" : getItem().toString();
                    }
                };

                cell.setAlignment(Pos.CENTER);
                return cell;
            }
        });
        type.setCellValueFactory(new PropertyValueFactory<DownloadDataTable, String>("type"));
        type.setText("Tipo");

        TableColumn<DownloadDataTable, String> status = new TableColumn<>("status");
        status.setCellFactory(new Callback<TableColumn<DownloadDataTable, String>, TableCell<DownloadDataTable, String>>() {
            @Override
            public TableCell<DownloadDataTable, String> call(TableColumn<DownloadDataTable, String> p) {
                TableCell cell = new TableCell<DownloadDataTable, String>() {
                    @Override
                    public void updateItem(String item, boolean empty) {
                        super.updateItem(item, empty);
                        setText(empty ? null : getString());
                        setGraphic(null);
                    }

                    private String getString() {
                        return getItem() == null ? "" : getItem().toString();
                    }
                };

                cell.setAlignment(Pos.CENTER);
                return cell;
            }
        });

        status.setCellValueFactory(new PropertyValueFactory<DownloadDataTable, String>("status"));
        status.setText("Status");

        downloadTable.getColumns().addAll(progress, type, status);

        List<PendingComponents> pendingComponents = downloadContent.getPendingComponents();

        ObservableList<DownloadDataTable> data = FXCollections.observableArrayList();

        for (PendingComponents pendingComponent : pendingComponents) {

            String typeComponent;

            if (pendingComponent.getType().equalsIgnoreCase(Constants.HTML)) {
                typeComponent = "Conteúdo Principal";
            } else {
                typeComponent = "Pacote de Imagens";
            }
            data.add(new DownloadDataTable(-1, typeComponent, "Preparando download"));
        }

        downloadTable.setItems(data);
        downloadTable.setColumnResizePolicy(TableView.CONSTRAINED_RESIZE_POLICY);

        TitledPane downloadPane = new TitledPane(title, downloadTable);

        downloadPane.setId(metaDado.getOfflineUuid());
        vBoxDownload.getChildren().add(downloadPane);
    }

ここまではすべて正常に動作しているように見えますが、テーブルを復元してデータを更新しようとすると、テーブルが更新されません。データ値が変更されても、すべてが機能しているように見えますが、テーブルはまだ更新されていません。私のコードを見てください:

private void publishProgress(final String msg) {
    Platform.runLater(new Runnable() {
        @Override
        public void run() {
            TitledPane titledPane = (TitledPane) controller.vBoxDownload.lookup("#"+metaDado.getOfflineUuid());
            TableView table = (TableView) titledPane.getContent();

            DownloadDataTable data = (DownloadDataTable) table.getItems().get(0);
            data.setProgress(100);
            data.setStatus(msg);
        }
    });
}

行を削除して追加しようとしても機能しませんが、新しい値を持つ別の行を追加するだけでは、同じ値を持つ古い行と新しい値を持つ新しい行が得られます。私は何が間違っているのか分かりません。誰かが私を助けることができますか??

4

1 に答える 1