我正在尝试使用 DataFX 将 CSV 文件的内容加载到 TableView 中。我创建了一个新的 JavaFX 项目,除了在后台加载这个文件之外什么都不做。在控制器中,我有以下代码
File file = new File("test.csv");
if (file.exists() && file.canRead()) {
DataSourceReader dsr1 = new FileSource(file);
String[] cols ={"FNAME","LNAME","ADDRESS"};
MyCSVDataSource ds1 = new MyCSVDataSource(dsr1, cols);
TableView tableView = new TableView();
tableView.setItems(ds1.getData());
System.out.println("CSV : " + ds1.getData().size());
ds1.getData().size() 总是返回零。我已经处理了空格、列名等。CSV 非常简单,我用 NotePad++ 编写了它:
FNAME,LNAME,ADDRESS
Frank,Noris,42 iOpus Drive
Ann,Coleman,PO Box 12345
Thomas,Test,1 Bills Drive
由于我不知道是什么问题,我下载了 CSVDataSource.java 和 DataSource.java 的源代码并使用它们,所以我可以设置一些 println 并使用调试器进行分析。所以在后台,CSVDataSource 创建了一个内部类和一个服务,用于加载文件的内容。我在任务执行函数中添加了一个 println:
@Override
protected Task createTask() {
Task task = new Task() {
@Override
protected Object call() throws Exception {
try {
BufferedReader br = new BufferedReader(new InputStreamReader(myReader.getInputStream(), "UTF-8"));
String line;
int row = 0;
while ((line = br.readLine()) != null) {
System.out.println(line);
if (line.trim().isEmpty()) {
continue;
}
一起执行输出如下:
CSV : 0
FNAME,LNAME,ADDRESS
Frank,Noris,42 iOpus Drive
Ann,Coleman,PO Box 12345
Thomas,Test,1 Bills Drive
有了这个,我知道服务是在我调用 ds1.getData().size() 之后执行的,尽管在 CSVDataSource 构造函数中调用了 start :
public MyCSVDataSource(DataSourceReader reader, String... cols) {
for (String col : cols) {
selectedColumnNames.add(col);
}
DataRetriever retriever = new DataRetriever(reader);
retriever.start();
}
因此在调用 ds1.getData().size() 时它为零。您能否确认此假设是否正确以及如何正确加载 CSV。仅供参考,我将代码移至应用程序文件,但问题仍然存在。
先感谢您。