9

我正在使用 JavaFX 使用简单的 CSV 查看器测试自己,但我一直在填充表数据。我确实动态地创建了列,但是数据值是不行的。我在网上搜索并找到了几种方法,但所有方法都包括一个带有自定义类(包括 get/set)的 ObservableList,它在 CSV 查看器中必须是动态的(CSV 可以有任意数量的列,这意味着任意数量的数据值)。

例子:

List<String> columns;
List<List<String>> data;

/* Fills 'columns' and 'data' */
parseCSV("C:/list.csv");

int columnIndex = 0;
TableColumn [] tableColumns = new TableColumn[columns.size()];        
for(String columName : columns) {
    tableColumns[columnIndex++] = new TableColumn(columName);
}
table1.getColumns().addAll(tableColumns);

for(List<String> dataList : data) {
    table1.setItems(dataList); // Requires an ObservableList!
}
4

2 回答 2

9

使用DataFX,这将使您的工作更轻松 :)

示例代码:

DataSourceReader dsr1 = new FileSource("your csv file path");
String[] columnsArray // create array of column names you want to display 
CSVDataSource ds1 = new CSVDataSource(dsr1,columnsArray);
TableView tableView = new TableView();
tableView.setItems(ds1.getData());
tableView.getColumns().addAll(ds1.getColumns());

参考: DataFX简介

编辑: 标准JavaFX方式

替换您的代码:

for(List<String> dataList : data) {
    table1.setItems(dataList); // Requires an ObservableList!
}

  //  which will make your table view dynamic 
 ObservableList<ObservableList> csvData = FXCollections.observableArrayList(); 

 for(List<String> dataList : data) {
     ObservableList<String> row = FXCollections.observableArrayList();
    for( String rowData : dataList) {
      row.add(rowData); 
  }
   cvsData.add(row); // add each row to cvsData
}

table1.setItems(cvsData); // finally add data to tableview
于 2012-11-11T20:33:00.183 回答
1

我没有遵循@invariant 的答案所描述的方式。

我有一个包含几列和很多行的excel文件。我用 aHashMap来跟踪哪个值属于哪个列。这边走:

int i = 0;
HashMap<String, Integer> columnNameIndexMap = new HashMap<>();

for (String header : excelFileData.getHeaders())
{
    TableColumn<List<String>, String> column = new TableColumn<>(header);
    columnNameIndexMap.put(header, i++); // Adding the connecting index to our map with key, name of column

    column.setCellValueFactory(data ->
            {
                String columnName = data.getTableColumn().getText();
                int currentIndex = columnNameIndexMap.get(columnName);
                String currentValue = data.getValue().get(currentIndex);

                return new SimpleStringProperty(currentValue);
            });
    tableView.getColumns().add(column);
}

for (List<String> row : excelFileData.getRows())
{
    tableView.getItems().add(row);
}

PS:您也可以使用excelFileData.getHeaders().indexOf(columnName)来获取不带HashMap.

不要注意excelFileData.getHeaders()返回带有字符串的列表和excelFileData.getRows()返回带有字符串列表的列表(List<List<String>>)。

于 2021-11-25T19:00:02.850 回答