Dá uma olhada nesse tutorial, nele é explicado pedacinho por pedacinho.
Bons estudos e bons codigos
V
venerfruet
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.
J
j-menezes
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?
importjavafx.application.Application;importjavafx.beans.property.ReadOnlyObjectWrapper;importjavafx.collections.*;importjavafx.scene.Scene;importjavafx.scene.control.*;importjavafx.stage.Stage;importjava.util.*;publicclassDynamicTableViewextendsApplication{privatestaticfinalintN_COLS=5;privatestaticfinalintN_ROWS=1000;publicvoidstart(Stagestage)throwsException{TestDataGeneratordataGenerator=newTestDataGenerator();TableView<ObservableList<String>>tableView=newTableView<>();// add columnsList<String>columnNames=dataGenerator.getNext(N_COLS);for(inti=0;i<columnNames.size();i++){finalintfinalIdx=i;TableColumn<ObservableList<String>,String>column=newTableColumn<>(columnNames.get(i));column.setCellValueFactory(param->newReadOnlyObjectWrapper<>(param.getValue().get(finalIdx)));tableView.getColumns().add(column);}// add datafor(inti=0;i<N_ROWS;i++){tableView.getItems().add(FXCollections.observableArrayList(dataGenerator.getNext(N_COLS)));}tableView.setPrefHeight(200);Scenescene=newScene(tableView);stage.setScene(scene);stage.show();}publicstaticvoidmain(String[]args){launch(args);}privatestaticclassTestDataGenerator{privatestaticfinalString[]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(" ");privateintcurWord=0;List<String>getNext(intnWords){List<String>words=newArrayList<>();for(inti=0;i<nWords;i++){if(curWord==Integer.MAX_VALUE){curWord=0;}words.add(LOREM[curWord%LOREM.length]);curWord++;}returnwords;}}}
V
venerfruet
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.
J
j-menezes
Voce quer fazer isso?
importjava.io.BufferedReader;importjava.io.File;importjava.io.FileReader;importjavafx.application.Application;importjavafx.beans.property.ReadOnlyObjectWrapper;importjavafx.collections.*;importjavafx.scene.Scene;importjavafx.scene.control.*;importjavafx.stage.Stage;importjava.util.*;publicclassTableViewCSVextendsApplication{TableView<ObservableList<String>>tableView=newTableView<>();Stringheaders[]=null;Stringdata[]=null;List<String>columnNames=newArrayList();// List<ObservableList> datas = new ArrayList();publicvoidstart(Stagestage)throwsException{Filef=newFile("sample.csv");if(f.exists()&&!f.isDirectory()){FileReaderfin=newFileReader(f);BufferedReaderin=newBufferedReader(fin);Stringl;inti=0;while((l=in.readLine())!=null){if(i==0){headers=l.split(",");for(intx=0;x<headers.length;x++){columnNames.add(headers[x]);}}else{data=l.split(",");ObservableList<String>ol=FXCollections.observableArrayList();for(intx=0;x<headers.length;x++){ol.add(data[x]);}tableView.getItems().add(ol);// datas.add( ol );}i++;}}for(inti=0;i<columnNames.size();i++){finalintfinalIdx=i;TableColumn<ObservableList<String>,String>column=newTableColumn<>(columnNames.get(i));column.setCellValueFactory(param->newReadOnlyObjectWrapper<>(param.getValue().get(finalIdx)));tableView.getColumns().add(column);}tableView.setPrefHeight(200);Scenescene=newScene(tableView);stage.setScene(scene);stage.show();}publicstaticvoidmain(String[]args){launch(args);}}
V
venerfruet
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.
V
venerfruet
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.