JavaFX popular TableView com uma List

Boa tarde,

Preciso demonstrar a importação de um arquivo CSV com leitura pelo Scanner e exibir o resultado em um TableView. Porém estou com dificuldades para criar o CellDataFactory.
Segue link para o código da classe.
https://github.com/venerfruet/TechDoFuturoJava/blob/2823d4393915d2aaef101eaefc26caaee10c1278/TableData.java

Dá uma olhada nesse tutorial, nele é explicado pedacinho por pedacinho.

Bons estudos e bons codigos

Obarigado pela ajuda sr. J-menezes. Porém neste exemplo é usado um data model, o que é justamente o que quero evitar. O problema maior do data model e que ele tem propriedades definidas e na importação de um arquivo não e possível um data model definido, teria que ser data model generico, por isso quero evitar o uso.
Mas agradeço a atenção.

Voce tem um exemplo para mostrar um uso generico?
Generico que voce se refere tem a ver com a quantidade de colunas ou com o tipo diferente delas na mesma coluna ou ambas ou ainda não é isso?

Se for pra variar o numero de colunas veja esse exemplo
Nesse caso mudar os valores dessas variaveis dentro do programa e veja o que acontece
private static final int N_COLS = 5;
private static final int N_ROWS = 1000;

import javafx.application.Application;
import javafx.beans.property.ReadOnlyObjectWrapper;
import javafx.collections.*;
import javafx.scene.Scene;
import javafx.scene.control.*;
import javafx.stage.Stage;

import java.util.*;

public class DynamicTableView extends Application {    
    private static final int N_COLS = 5;
    private static final int N_ROWS = 1000;

    public void start(Stage stage) throws Exception {
        TestDataGenerator dataGenerator = new TestDataGenerator();

        TableView<ObservableList<String>> tableView = new TableView<>();

        // add columns
        List<String> columnNames = dataGenerator.getNext(N_COLS);
        for (int i = 0; i < columnNames.size(); i++) {
            final int finalIdx = i;
            TableColumn<ObservableList<String>, String> column = new TableColumn<>(
                    columnNames.get(i)
            );
            column.setCellValueFactory(param ->
                    new ReadOnlyObjectWrapper<>(param.getValue().get(finalIdx))
            );
            tableView.getColumns().add(column);
        }

        // add data
        for (int i = 0; i < N_ROWS; i++) {
            tableView.getItems().add(
                    FXCollections.observableArrayList(
                            dataGenerator.getNext(N_COLS)
                    )
            );
        }

        tableView.setPrefHeight(200);

        Scene scene = new Scene(tableView);
        stage.setScene(scene);
        stage.show();
    }

    public static void main(String[] args) {
        launch(args);
    }

    private static class TestDataGenerator {
        private static final String[] LOREM = "Lorem ipsum dolor sit amet, consectetur adipiscing elit. Nunc tempus cursus diam ac blandit. Ut ultrices lacus et mattis laoreet. Morbi vehicula tincidunt eros lobortis varius. Nam quis tortor commodo, vehicula ante vitae, sagittis enim. Vivamus mollis placerat leo non pellentesque. Nam blandit, odio quis facilisis posuere, mauris elit tincidunt ante, ut eleifend augue neque dictum diam. Curabitur sed lacus eget dolor laoreet cursus ut cursus elit. Phasellus quis interdum lorem, eget efficitur enim. Curabitur commodo, est ut scelerisque aliquet, urna velit tincidunt massa, tristique varius mi neque et velit. In condimentum quis nisi et ultricies. Nunc posuere felis a velit dictum suscipit ac non nisl. Pellentesque eleifend, purus vel consequat facilisis, sapien lacus rutrum eros, quis finibus lacus magna eget est. Nullam eros nisl, sodales et luctus at, lobortis at sem.".split(" ");

        private int curWord = 0;

        List<String> getNext(int nWords) {
            List<String> words = new ArrayList<>();

            for (int i = 0; i < nWords; i++) {
                if (curWord == Integer.MAX_VALUE) {
                    curWord = 0;
                }

                words.add(LOREM[curWord % LOREM.length]);
                curWord++;
            }

            return words;
        }
    }
}

Pois é, nunca vi um data model generico mas nao deixa de ser uma classe da pra tentar fazer um, tentei usar o cellvaluefactory e é nesse ponto que esta dando problema, acredito que seja um problema de aceitação do java em minha list aninha em outra lista, talvez tenha que mudar para array aninhado em uma list ou mesmo um array bidimensional.

Voce quer fazer isso?

import java.io.BufferedReader;
import java.io.File;
import java.io.FileReader;
import javafx.application.Application;
import javafx.beans.property.ReadOnlyObjectWrapper;
import javafx.collections.*;
import javafx.scene.Scene;
import javafx.scene.control.*;
import javafx.stage.Stage;

import java.util.*;

public class TableViewCSV extends Application {    
    
    TableView<ObservableList<String>> tableView = new TableView<>();
    
    String headers[] = null;
    String data[] = null;
    
    List<String> columnNames = new ArrayList();
    // List<ObservableList> datas = new ArrayList();
    
    public void start(Stage stage) throws Exception {
        
        File f = new File("sample.csv");
        if (f.exists() && !f.isDirectory()) {
            FileReader fin = new FileReader(f);
            BufferedReader in = new BufferedReader(fin);
            String l;
            int i = 0;

            while ((l = in.readLine()) != null) {
               if(i == 0 ) {
                   headers = l.split(",");
                   for(int x=0; x < headers.length; x++) {
                      columnNames.add(headers[x]);
                   }
                
               }else {
                   data = l.split(",");
                   ObservableList<String> ol = FXCollections.observableArrayList();
                   for(int x=0; x < headers.length; x++) {
                      ol.add( data[x]);                      
                   }
                   tableView.getItems().add( ol );
                   // datas.add( ol );
               }
               i++; 
            }
        }
        
         
        for (int i = 0; i < columnNames.size(); i++) {
            final int finalIdx = i;
            TableColumn<ObservableList<String>, String> column = new TableColumn<>(
                    columnNames.get(i)
            );
            column.setCellValueFactory(param ->
                    new ReadOnlyObjectWrapper<>(param.getValue().get(finalIdx))
            );
            tableView.getColumns().add(column);
        }
 
        tableView.setPrefHeight(200);

        Scene scene = new Scene(tableView);
        stage.setScene(scene);
        stage.show();
    }

    public static void main(String[] args) {
        launch(args);
    }

}

Foi o que eu disse, vou ter que alterar minha list aninhada em outra list por um array. É o que este exemplo mostra.
Por algum motivo o TableColumn não está aceitando minha list aninhada.
Vou mudar para array e ver o que acontece.
Obrigado pela ajuda.

Encontrei a solução alterando a list de list para uma list de strings o que resulta em list de linhas do arquivo csv. A separação dos campos é feita no metodo popula tabela.
Mas como quero demonstrar o uso do scanner por completo vou adaptar o código para criar uma lista de arrays.
Obrigado.