如何使用javaFx更新TableView Row

时间:2013-07-30 13:28:38

标签: javafx-2 javafx tableview

我试图进行一些下载并在我的表格中显示进度:

enter image description here

要做到这一点我使用以下类:

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

直到这里一切似乎都运行正常,但是当我尝试恢复我的表并更新数据时,我的表格没有更新。我已经进行了debbuged,一切似乎都有效,即使数据值发生了变化,但我的表仍然没有更新。看我的代码:

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

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

1 个答案:

答案 0 :(得分:8)

当进度值发生变化时,您不需要添加/删除行以使表更新。

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

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

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

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

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