JavaFX TableView 动态列和数据值

Posted

技术标签:

【中文标题】JavaFX TableView 动态列和数据值【英文标题】:JavaFX TableView dynamic column and data values 【发布时间】:2012-10-31 04:44:49 【问题描述】:

我正在使用 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!

【问题讨论】:

【参考方案1】:

使用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());

参考:Introduction to 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

【讨论】:

感谢您的回答,但是.. 上面的示例说:无法将 java.io.FileReader 转换为 org.javafxdata.datasources.io.DataSourceReader。下载的 DataFX 库(v0.0.6 - 最新)不包含它自己的 FileReader 实现,但 NetBeans 建议使用 org.javafxdata.datasources.io.FileSource 并且它可以工作(所有值都被解析并存储到 CSVDataSource 中)但 CSVDataSource 没有包含列(ds1.getColumns() 返回一个长度为 0 的数组)。这将是一个快速的解决方案,但仍在尝试找到标准的 JavaFx 方式.. @AlenBer 编辑了 DataFx 代码,现在可以正常工作了:),还添加了标准 JavaFX 方式代码:) 嗨@invariant,你能看看我的帖子吗?我遵循您的标准 javaFX 方式,但仍有一些问题***.com/questions/22129559/… 我不认为这个类在 datafx 的最新版本中。很高兴得到纠正,因为我希望使用它。 详细标准JavaFX方式,参考-community.oracle.com/thread/2474328【参考方案2】:

我没有按照@invariant的答案描述的方式。

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

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

P.S:您也可以使用excelFileData.getHeaders().indexOf(columnName) 来获取没有HashMap 的索引。

不要注意excelFileData.getHeaders()返回带有字符串的列表,excelFileData.getRows()返回带有字符串列表的列表(List&lt;List&lt;String&gt;&gt;)。

【讨论】:

谢谢你提醒我我多大了 :) 我更喜欢经验丰富的 :)

以上是关于JavaFX TableView 动态列和数据值的主要内容,如果未能解决你的问题,请参考以下文章

向 Tableview Javafx 动态添加和删除 tablecolumn

Javafx:TableView根据行列获取特定表格单元格的图形节点

如果滚动到底部太快,JavaFX TableView 会崩溃,自定义单元格也会在操作上变得不合逻辑

JavaFX 2 TableView:根据单元格内的数据不同的单元格工厂

javafx tableView 不显示数据,getter setter 有啥问题?

JavaFx:窗口切换和ListView以及TableView的值绑定