2

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

先感谢您。

4

0 回答 0