Javafx 2 如何使用javaFx更新TableView行

Javafx 2 如何使用javaFx更新TableView行,javafx-2,javafx,tableview,Javafx 2,Javafx,Tableview,我正在尝试进行一些下载,并在我的表中显示进度: 为此,我使用以下类: public class DownloadDataTable { private SimpleDoubleProperty progress; private SimpleStringProperty type; private SimpleStringProperty status; public DownloadDataTable(double progress, String ty

我正在尝试进行一些下载,并在我的表中显示进度:

为此,我使用以下类:

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和column表,我将执行以下操作:

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);
    }

如果我尝试删除并添加我的行,它将不起作用,但如果我只添加另一行和新值,我将得到一个具有相同值的旧行和一个具有新值的新行。我不知道我做错了什么,有人可以帮我吗???

您不需要添加/删除行,以便在进度值更改时更新表

问题是您没有使TableView可以访问progress属性。这会导致调用progress.setCellValueFactory(…)将getProgress()值包装在新的ObserveObject包装器中。这允许值显示在TableView中,但在值更改时不会通知表

将以下内容添加到DownloadDataTable类中,当值更改时,表将更新:

public SimpleDoubleProperty progressProperty() {
    return this.progress;
}

public SimpleStringProperty typeProperty() {
    return this.type;
}

public SimpleStringProperty statusProperty() {
    return this.status;
}

请检查的条目,如果问题仍然存在,请更新您的问题。这是否在文档中的某个位置?谢谢@jhsheets在javadoc中:
public SimpleDoubleProperty progressProperty() {
    return this.progress;
}

public SimpleStringProperty typeProperty() {
    return this.type;
}

public SimpleStringProperty statusProperty() {
    return this.status;
}