2015-12-19 66 views
0

在我的模型中,我有和Cell對象,它們表示從文件讀取的表格數據。每個可以返回一個單元格列表。我想填充的TableView與Cell.toString()值,是這樣的:如何使用List <Object>的行填充TableView?

for (Row row : rows) { 
    // Add row to TableView. 
    for (Cell cell : row.getCells()) { 
     // Add cell.toString() in a current TableView row. 
    } 
} 

我發現處理了一些對象的字段相關聯列的大多數教程,但我只是想不知道哪些列代表顯示數據。

回答

1

從本質上講,您的問題歸結爲您需要動態數量的列,這不是TableView最初製作的事實:它不呈現對象關係 - 它被設計爲顯示屬性,它是固定的該TableView的對象(鍵/屬性是每個對象相同 - 例如,一個人的名字,年齡,等...)


下面我實現了一個簡單的方法是如何完全可運行的例子這可以實現。

import javafx.application.Application; 
import javafx.beans.property.SimpleStringProperty; 
import javafx.scene.Scene; 
import javafx.scene.control.TableColumn; 
import javafx.scene.control.TableView; 
import javafx.stage.Stage; 

import java.util.ArrayList; 
import java.util.List; 
import java.util.Random; 

public class DynamicTableViewColumnCount extends Application 
{ 

    public static void main(String[] args) 
    { 
     launch(args); 
    } 

    @Override 
    public void start(Stage primaryStage) throws Exception 
    { 
     TableView<Row> tableView = new TableView<>(); 

     // make sample data 
     List<Row> rows = makeSampleData(); 

     int max = getMaxCells(rows); 
     makeColumns(max, tableView); 
     tableView.getItems().addAll(rows); 

     // Boilerplate code for showing the TableView 
     Scene scene = new Scene(tableView, 1000, 1000); 
     primaryStage.setScene(scene); 
     primaryStage.show(); 
    } 

    public void makeColumns(int count, TableView<Row> tableView) 
    { 
     for (int m = 0; m < count; m++) 
     { 
      TableColumn<Row, String> column = new TableColumn<>(Integer.toString(m)); 
      column.setCellValueFactory(param -> { 
//    int index = Integer.parseInt(param.getTableColumn().getText()); 
       int index = param.getTableView().getColumns().indexOf(param.getTableColumn()); 
       List<Cell> cells = param.getValue().getCells(); 
       return new SimpleStringProperty(cells.size() > index ? cells.get(index).toString() : null); 
      }); 
      tableView.getColumns().add(column); 
     } 
    } 

    public int getMaxCells(List<Row> rows) 
    { 
     int max = 0; 
     for (Row row : rows) 
      max = Math.max(max, row.getCells().size()); 
     return max; 
    } 

    public List<Row> makeSampleData() 
    { 
     Random random = new Random(); 
     List<Row> rows = new ArrayList<>(); 
     for (int i = 0; i < 16; i++) 
     { 
      Row e = new Row(); 
      int jMax = random.nextInt(6); // from 0 to 5 
      for (int j = 0; j <= jMax; j++) 
      { 
       e.getCells().add(new Cell(Long.toHexString(random.nextLong()))); 
      } 
      rows.add(e); 
     } 
     return rows; 
    } 

    static class Row 
    { 
     private final List<Cell> list = new ArrayList<>(); 

     public List<Cell> getCells() 
     { 
      return list; 
     } 
    } 

    static class Cell 
    { 
     private final String value; 

     public Cell(String value) 
     { 
      this.value = value; 
     } 

     @Override 
     public String toString() 
     { 
      return value; 
     } 
    } 
}