Java FX - Data FX - 将CSV文件加载到TableView中

时间:2013-07-31 11:17:31

标签: csv javafx tableview

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

提前谢谢。

0 个答案:

没有答案