我正在尝试使用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。仅供参考,我将代码移至应用程序文件,问题仍然存在。
提前谢谢。