2013-07-30 5 views
4

Я пытаюсь сделать некоторые загрузки и показать прогресс внутри моего стола:Как обновить Tableview строки с помощью JavaFX

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

Пожалуйста, просмотрите записи [настоящий результат поиска] (http://stackoverflow.com/search?q =% 5Bjavafx-2% 5D + или +% 5Bjavafx% 5D + tableview + refresh + row + is% 3Aquestion + отвечает% 3A1), и если проблема не устраняет проблему, обновите свой вопрос. –

+0

Я уже сделал это. –

ответ

8

Вам не нужно добавлять/удалять строку, чтобы обновить таблицу при изменении значения прогресса.

Проблема заключается в том, что вы не делаете доступную для TableView информацию о состоянии прогресса. Это вызывает ошибку progress.setCellValueFactory (...), чтобы обернуть ваше значение getProgress() в новом ObservableObjectWrapper. Это позволяет отображать значение в TableView, но оно не будет уведомлять таблицу при изменении значения.

Добавьте следующие строки в DownloadDataTable класса, и ваша таблица будет обновляться при изменении значения:

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

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

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

Это работает. Спасибо огромное! –

+0

Это где-то в документации? Спасибо @jhsheets – betaman

+0

Это в javadoc: http://docs.oracle.com/javafx/2/api/javafx/scene/control/cell/PropertyValueFactory.html – jhsheets

Смежные вопросы