![](/img/trans.png)
[英]Adding data to tableview in JavaFX gives every column identical values
[英]JavaFX TableView dynamic column and data values
我正在使用 JavaFX 用一个简单的 CSV 查看器测试自己,但我一直在填充表数据。 我确实动态创建了列,但数据值是不行的。 我在网上搜索并找到了几种方法,但所有方法都包括带有自定义类(包括获取/设置)的 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!
}
使用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
我没有遵循@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);
}
PS:您也可以使用excelFileData.getHeaders().indexOf(columnName)
来获取没有HashMap
的索引。
不要注意excelFileData.getHeaders()
返回一个包含字符串的列表而excelFileData.getRows()
返回一个包含字符串List<List<String>>
( List<List<String>>
)。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.